MQL5 リファレンス言語基礎データ型オブジェクトポインタ 

オブジェクトポインタ

MQL5では、動的複合型のオブジェクトを作成することが出来ます。これは、作成されたオブジェクトの記述子を返す new 演算子によって行われます。記述子は 8 バイトです。構文的には、MQL5のオブジェクト記述子は、C++でのポインタに似ています。

例:

MyObject* hobject= new MyObject();

C++とは対照的に、上記の例の hobject 変数は、メモリへのポインタではなくオブジェクト記述子です。また、MQL5では、関数パラメータ内の全てのオブジェクトは、参照によって渡される必要があります。下記は、オブジェクトを関数のパラメータとして渡す例です。

class Foo
 {
public:
  string            m_name;
  int               m_id;
  static int        s_counter;
  //--- コンストラクタとデストラクタ
                    Foo(void){Setup("noname");};
                    Foo(string name){Setup(name);};
                   ~Foo(void){};
  //--- Foo 型のオブジェクトを初期化する
  void              Setup(string name)
    {
     m_name=name;
     s_counter++;
     m_id=s_counter;
    }
 };
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 自動作成を使用してオブジェクトを変数として宣言する
  Foo foo1;
//--- 参照によってオブジェクトを渡す
  PrintObject(foo1);
 
//--- オブジェクトへのポインタを宣言し「new」演算子を使用して作成する
  Foo *foo2=new Foo("foo2");
//--- 参照によってオブジェクトへのポインタを渡す
  PrintObject(foo2); // オブジェクトへのポインタは、コンパイラによって自動的に変換される
 
//--- Foo 型のオブジェクトの配列を宣言する
  Foo foo_objects[5];
//--- オブジェクトの配列を渡す
  PrintObjectsArray(foo_objects); // オブジェクトの配列を渡すための関数
 
//--- Foo 型オブジェクトへのポインタの配列を宣言する
  Foo *foo_pointers[5];
  for(int i=0;i<5;i++)
    {
     foo_pointers[i]=new Foo("foo_pointer");
    }
//--- ポインタの配列を渡す
  PrintPointersArray(foo_pointers); // ポインタの配列を渡すための関数
 
//--- ポインタとして作成されたオブジェクトはプログラム終了前に削除される必要がある
  delete(foo2);
//--- ポインタ配列を削除する
  int size=ArraySize(foo_pointers);
  for(int i=0;i<5;i++)
    delete(foo_pointers[i]);
//---  
 }
//+------------------------------------------------------------------+
//| オブジェクトは常に参照によって渡される                                       |
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
 {
  Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
 }
//+------------------------------------------------------------------+
//| オブジェクトの配列を渡す                                                |
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
 {
  int size=ArraySize(objects);
  for(int i=0;i<size;i++)
    {
     PrintObject(objects[i]);
    }
 }
//+------------------------------------------------------------------+
//| オブジェクトにポインタの配列を渡す                                          |
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
 {
  int size=ArraySize(objects);
  for(int i=0;i<size;i++)
    {
     PrintObject(objects[i]);
    }
 }
//+------------------------------------------------------------------+

参照

変数変数の初期化変数のアクセス権スコープとライフタイムオブジェクトの作成と解徐