MQL5、クラスについて教えてください。

 

MQL5、クラスについて勉強中です。

MQL5がC++ プログラミング言語の概念に基づいているとのことなので、C++をネットで検索して学んだりしましたが、どうしても次の内容が理解できなかったのでフォーラムで質問してみました。よろしくお願いします。

MQL5サイトのリファレンス、共通関数、GetPointer(https://www.mql5.com/ja/docs/common/getpointer)の例を解読していますが、下記の部分が解らないので教えてください。



//+------------------------------------------------------------------+
//|                                             Check_GetPointer.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link     "https://www.mql5.com"
#property version   "1.00"
 
//+------------------------------------------------------------------+
//| リスト要素を実装するクラス                                               |
//+------------------------------------------------------------------+
class CItem
 {
  int               m_id;
  string            m_comment;
  CItem*            m_next;
public:
                    CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                   ~CItem() { Print("Destructor of ",m_id,
                                    (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                    "dynamic":"non-dynamic"); }
  void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
  void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
  int               Identifier() { return(m_id); }
  CItem*            Next() {return(m_next); }
  void              Next(CItem *item) { m_next=item; }
 };
//+------------------------------------------------------------------+
//| リストの最も単純なクラス                                                 |
//+------------------------------------------------------------------+
class CMyList
 {
  CItem*            m_items;
public:
                    CMyList() { m_items=NULL; }
                   ~CMyList() { Destroy(); }
  bool             InsertToBegin(CItem* item);
  void             Destroy();
 };
//+------------------------------------------------------------------+
//| 先頭にリスト要素を挿入する                                              |
//+------------------------------------------------------------------+
bool CMyList::InsertToBegin(CItem* item)
 {
  if(CheckPointer(item)==POINTER_INVALID) return(false);
//---
  item.Next(m_items);
  m_items=item;
//---
  return(true);
 }
//+------------------------------------------------------------------+
//| 要素の削除によってリストを削除する                                         |
//+------------------------------------------------------------------+
void CMyList::Destroy()
 {
//--- ループの中で作業するためのサービスポインタ
  CItem* item;
//--- ループを通過し、動的なポインタの削除を試みる
  while(CheckPointer(m_items)!=POINTER_INVALID)
    {
     item=m_items;
     m_items=m_items.Next();
    if(CheckPointer(item)==POINTER_DYNAMIC)
       {
        Print("Dynamyc object ",item.Identifier()," to be deleted");
        delete (item);
       }
    else Print("Non-dynamic object ",item.Identifier()," cannot be deleted");
    }
//---
 }

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
  CMyList list;
  CItem   items[10];
  CItem*  item;
//--- 作成し、リスト動的オブジェクトのポインタに追加
  item=new CItem;
  if(item!=NULL)
    {
     item.Initialize(100,"dynamic");
     item.PrintMe();
     list.InsertToBegin(item);
    }
//--- 自動ポインタをリストに追加する
  for(int i=0; i<10; i++)
    {
     items[i].Initialize(i,"automatic");
     items[i].PrintMe();
     item=GetPointer(items[i]);
    if(CheckPointer(item)!=POINTER_INVALID)
        list.InsertToBegin(item);
    }
//--- リスト先頭に動的なオブジェクトポインタをあと 1 つ追加する
  item=new CItem;
  if(item!=NULL)
    {
     item.Initialize(200,"dynamic");
     item.PrintMe();
     list.InsertToBegin(item);
    }
//--- リスト要素を全て削除する
  list.Destroy();
//--- スクリプト終了後、全てのリスト要素が削除される
//--- 端末内の「エキスパート」タブを参照する
 }

(1)クラス内のクラス型*変数名の認識は下記で問題ないですか?(黄色マーカー部分)
 クラス内のポインタ変数(CImte *m_next)は、クラス型の変数、配列、ポインタのどれで宣言して(どのインスタンスから)参照てもクラス内ポインタ変数の値は変わらないという認識で問題ないですか? ただこれだと、連想配列のキーがどれになるのかなと疑問が残ります。理由は、Destroyメソッド内の m_items=m_items.Next();でオブジェクト生成の逆順になるようにオブジェクト記述子を m_items に格納しているからです。


(2)クラス内のクラス型*メソッド名 (CItem *Next() ) が基本データ型ではないメソッドなのでどういう意味か理解できていません。(青色マーカー部分)
どのように解釈すればよいのでしょうか。


(3)上記スクリプトの (赤色マーカー部分)InsertTobeginメソッドの引数に(クラス型 * 変数名)となっているので、ポインタを渡しているように思えるのですが、この認識に間違えはないですか?

ポインタを関数の引数として渡すことも禁止されています。これらの場合全てで、コンパイラはエラーを通知します。

認識に問題ない場合、該当のページの注意事項にこの内容が記載されていますが、 ポインタを渡すことは問題ないという事でしょうか?

MQL5のドキュメンテーション: 共通関数 / GetPointer
MQL5のドキュメンテーション: 共通関数 / GetPointer
  • www.mql5.com
GetPointer - 共通関数 - MQL5 リファレンス - MetaTrader 5 のためのアルゴリズムの/自動化されたトレーディング言語のリファレンス
 

これは英語フォーラムに投稿してください。

https://www.mql5.com/en/forum/indicators

MQL5 forum: Technical Indicators
MQL5 forum: Technical Indicators
  • www.mql5.com
Questions about the development of technical indicators in the MQL5 language
 
Nagisa Unada:

これは英語フォーラムに投稿してください。

https://www.mql5.com/en/forum/indicators

教えて下さりありがとうございました。m(_ _)m
 
e_mql_hiyoko:
教えて下さりありがとうございました。m(_ _)m

どういたしまして。

しかしあちらでも回答がついていないですね。

1-2日待って回答がなければ厳しいかも。

 
Nagisa Unada:

どういたしまして。

しかしあちらでも回答がついていないですね。

1-2日待って回答がなければ厳しいかも。

おはようございます。

すみません、コメント気づきませんでした(*_*)

確認して下さりありがとうございます!

そうですね、いまだに回答が無いので難しそうですね(^^;

理由: