2015年7月21日火曜日

MQL4のオブジェクトとリファレンスとポインタと渡し

CやC++で、よく使うパラメータのセットを1つのstructにまとめることは珍しくないが、MQL4ではどうするか? 関数の引数として参照を渡すだけなら、普通にstructを定義すれば良い。が、別のクラスに参照を渡したい場合はいくつか罠を避けなければならない。

まずMQL4のclassは、データメンバとしてclassの参照を持てない。C++では通るような以下のコードも、MQL4ではNG。

struct Param {
  // parameters...
};

class Foo {
  const Param &m_param;
public:
  Foo(const Param &param) : m_param(param) {}
};
コンパイルしようとすると、'&' - reference cannot usedと怒られる。

そこで参照の代わりに使えるのがポインタ。が、MQL4にはCやC++のような & 演算子はなく、ポインタを取得するにはGetPointer()を使う。ただし、GetPointer()の引数に渡せるのはclassのインスタンスだけ。structのインスタンスのポインタは取得できないので、ただパラメータを束ねたいだけで真面目にアクセス権を管理する気がなくても、classにしておかなければならない。

class Param {
public:
  // parameters...
};

class Foo {
  const Param *m_param;
public:
  Foo(const Param &param) : m_param(GetPointer(param)) {}
};
C++のstructはデフォルトのアクセス権がpublicなだけで実質classと同じだけど、MQL4ではstructとclassは明確に別物。また、MQL4にはCやC++の * や -> のような関節参照演算子はなく、ポインタであろうがなかろうが、メンバーには . 演算子でアクセスする。

0 件のコメント:

コメントを投稿