オブジェクトポインタ
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]); } } //+——————————————————————+ |
Originally posted 2019-07-27 09:58:41.
0 people found this article useful
0 people found this article useful