【超入門】MQL5 EA講座 第52回「クラスについて5 -コンストラクタ-」【EAの作り方】

MQL5でEA作ろう講座


前回は 派生クラス について解説しました。

改めて前回の内容をおさらいをしておくと、

ということをお伝えしました。

今回は コンストラクタ についてお話ししたいと思います。

スポンサーリンク
スポンサーリンク

コンストラクタとは?

コンストラクタ とは

クラスインスタンスを生成した段階で、発動するクラスメンバ関数のことです。

↑だけ読んでも全然ピンとこないと思います。もう少しだけ我慢してください<m(__)m>

インスタンスについては大丈夫でしょうか?

 インスタンスクラス構造体を実際に使う時に宣言する、変数名のようなものでしたね。

詳しいことは、

MQL5 EA講座 第49回「クラスについて2 -クラスの使い方-」

MQL5 EA講座 第22回「構造体」

またこの後予定しているMQL5 EA講座 第54回「インスタンスについて」

等をご確認ください。

メンバとはクラス構造体の中で定義された、個々の変数関数のことです。

普通、クラスメンバ関数を利用する際は、まずインスタンスを生成し、そのインスタンスからメンバ関数を呼び出す必要があります。

それに対して、コンストラクタインスタンスを生成した時点で、定義した関数処理を行ってくれます。↓

動画を見てもらうとわかる通り、サンプルコードでは、グローバル領域でインスタンスを生成後、OnStart関数で一切呼び出していないにも関わらず、コンストラクタのログ出力処理がなされているのがわかります。

※グローバル領域とは関数の外の領域のことです。

このように、コンストラクタの特筆すべき点は、クラスインスタンスを生成した段階で関数処理が実行されることにあります。

そのため、EAにおいても、変数配列を初期化する時などに、多く用いられます。

コンストラクタの作り方

コンストラクタメンバ関数なので、他のメンバ関数と同様にクラスの{}内に関数宣言をして、処理実装記述を定義していきます。(そのあたりの詳細は、第48回「クラスについて1 -クラスとは?-」をご覧ください)

コンストラクタのルール1:コンストラクタのデータ型は常にvoid

コンストラクタデータ型は常にvoid です。

コンストラクタを宣言する際にデータ型の指定は不要です。(別にvoid をつけてもコンパイルエラーにはなりません)

コンストラクタのルール2:コンストラクタの名前はクラスの名前と同じ

コンストラクタクラス名と同名である事をもってコンストラクタと認識されます。

またコンストラクタの機能から自ずとアクセスレベルpublic に限定されます。

//クラスの宣言
class exampleClass
{
  //コンストラクタの宣言(クラス名「exampleClass」と同じ名前を付ける
  public:
   exampleClass(){Print("コンストラクタ");};

};

あとは、クラスインスタンスを生成すれば、自動的にコンストラクタの処理が発動されるのは、見て頂いた通りです。(ここでは、処理記述をインライン定義で済ませていますが、もちろんグローバル領域にて処理記述を定義することもできます)

※逆に、コンストラクタOnStart関数などのイベントハンドラーから、通常のメンバ関数と同じように呼び出そうとした場合、「explicit constructor call not allowed (明示的なコンストラクタの呼び出しは許可されていません)」というコンパイルエラーが発生します。

//クラスの宣言
class exampleClass
{
  //コンストラクタの宣言
  public:
   exampleClass(){Print("コンストラクタ");};

};

//exampleClassのインスタンスを宣言
exampleClass ex;

void OnStart()
{
 //コンストラクタの明示的な呼び出しはエラーになる。
 ex.exampleClass();

      
}

↑のサンプルコードを実際にコンパイルしてみると・・・↓

おまけ

<その1:クラスと同名のメンバ関数に戻り値を設定しようとした場合>

もし、クラスと同名のメンバ関数戻り値を設定しようとした場合はどうなるでしょうか?

クラスと同名のメンバ関数コンストラクタであり、コンストラクタvoid型なので、「’return’ – ‘void’ function returns a value」というコンパイルエラーが発生します。

↓の動画では途中で、関数名をクラス名とは違う名前に変えることによって、コンパイルエラーが解消されているのがわかると思います。

合わせて「constructor must be of the void type (コンストラクタvoid型でなくてはいけません)」という警告も発されていますね。

<その2:コンストラクタのアクセスレベルをpublicに変えようとした場合>

コンストラクタの役割が、「クラスインスタンスの生成時に発動する関数」であることから、コンストラクタアクセスレベルは必然的にpublicに限定されているわけですが、ではアクセスレベルprivateprotectedにするとどうなるかというと・・・言うまでもなくコンパイルエラーが発生します。↓

まとめ

今回は コンストラクタ について解説しました。

今回の記事では以下のことを学びました

今回の記事を読んで、コンストラクタの仕組みはわかっても、実際のEA(自動売買プログラム)開発においてどうやって使うのか?という事は今はイメージしづらいかもしれません。今後の講座記事においては、

MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」

MQL5 EA講座 第109回「インジケータの値を簡単に取得できるクラスを作る」

で、コンストラクタを利用したコード記述解説を行っていますので、楽しみにして頂ければと思います。

クラスの実際の使用例に関しては、今後の講座記事にはなりますが、以下の記事で解説していますので、今はよくわからなくてもご安心ください。

MQL5 EA講座 第71回「トレード用のオリジナルクラスを作る」

MQL5 EA講座 第82回「ポジション情報管理クラスを作る-その1」

MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」

MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」

MQL5 EA講座 第96回「トレーリングストップクラスを作る1」

MQL5 EA講座 第97回「トレーリングストップクラスを作る2」

MQL5 EA講座 第100回「ブレイクイーブンストップ関数を作る」

コメント

タイトルとURLをコピーしました