改めて前回の内容をおさらいをしておくと、
ということをお伝えしました。
今回は引き続き クラスの使い方について解説したいと思います。
使い方、といってもそこまで細かい話をするわけではありません。
あくまで基本的な事だけで、実際にEA制作にあたって、どうやって利用するかについては後の講座でじっくりやりますので、ご安心ください。
クラスのメンバ関数の定義記述のやり方
前回の講座で、クラス内の関数(メンバ関数)について、クラスの{}内で行うのは、基本的には
データ型の設定
関数名の設定
引数の設定
までである、という事を書きました。
つまり、関数の実装記述(関数がどのような処理をするのか、という記述)はクラス内では基本的にしない、ということです。
メンバ関数の処理記述は基本的には、クラスの{}の外、グローバル領域で行います。
※メンバというのはクラス内で定義された個々の変数や関数のことです。
//classキーワード→クラス名
class exampleClass
{
private://アクセスレベルprivateを記述(キーワードの後にはコロン)
int ex1;//privateアクセスレベルの変数「ex1」の宣言
protected://アクセスレベルprotectedを記述(キーワードの後にはコロン)
double ex2;//protectedアクセスレベルの変数「ex2」の宣言
public://アクセスレベルpublicを記述(キーワードの後にはコロン)
int exFunction(int ex3);
};//文末にはセミコロンをつける。
//グローバル領域にてexampleClassの実装記述を行う
int exampleClass::exFunction(int ex3)
{
//具体的な実装記述
return ex3;
}
↑のサンプルコードにおいて、メンバ関数はint型が戻り値の、exFunctionです。仮引数にはint型の変数「ex3」を設定しています。
アクセスレベルを決定するアクセス指定子はpublicとなっていますが、アクセス指定子については次回解説予定ですので、今回は説明を割愛します。
クラス内の{}でメンバ関数について行う処理は一旦ここまでです。
前述したように、メンバ関数の実装記述はグローバル領域にて行っていきます。
//グローバル領域にてexampleClassの実装記述を行う
int exampleClass::exFunction(int ex3)
{
//具体的な実装記述
return ex3;
}
グローバル領域にて記述する内容を一般化すると
戻り値のデータ型 クラス名::関数名(引数のデータ型 引数) { //処理記述 }
となります。
サンプルコードに従って、順に見ていきましょう。
処理実装記述1:最初に関数の戻り値であるデータ型を記述
exFunction関数の戻り値はint型に設定しているので、int ですね。
処理実装記述2:クラス名を記述
その次に記述するのはクラス名である、
exampleClass
です。
処理実装記述3:クラス名のうしろにコロンを2つ(::)記述
クラス名のexampleClassに続けて
コロンを2つ(::)記述します。このダブルコロンの記載によって、次に書かれる関数名がexampleClass所属のメンバ関数である、という命令になります。
という訳で、ダブルコロン(::)の後に書かれるのは、関数名である
exFunction
ということになります。
処理実装記述4:クラス内で設定した仮引数のデータ型と仮引数名を記述
関数名exFunctionを書いたら、その後に記述するのはクラス内で設定した仮引数のデータ型と仮引数名です。
exFunction(int ex3)
という、クラスの{}内に記述した内容と同じですね。
処理実装記述5:{}内に、関数の具体的な処理を記述
ここまで書いたら、晴れて{}内に、関数の処理記述をしていきます。
{}内の記述に関しては、一般の関数と同じです。今回はシンプルに仮引数に設定した変数「ex3」を戻り値として返す、とだけ記述しています。
これでメンバ関数の処理実装記述は完了です。
メンバ関数の定義例外編 -インライン定義-
関数の実装記述(関数がどのような処理をするのか、という記述)はクラス内では「基本的に」しないと書きました。
「基本的に」ということは例外もあるわけで、ここではその例外について解説したいと思います。
つまり、簡単な記述であればクラスの{}内でも差し支えないということです。
クラスの{}内にて、メンバ関数の設定とあわせて、メンバ関数の処理実装記述を行ってしまうことをインライン定義、などといったりもします。
//classキーワード→クラス名
class exampleClass
{
private://アクセスレベルprivateを記述(キーワードの後にはコロン)
int ex1;//privateアクセスレベルの変数「ex1」の宣言
protected://アクセスレベルprotectedを記述(キーワードの後にはコロン)
double ex2;//protectedアクセスレベルの変数「ex2」の宣言
public://アクセスレベルpublicを記述(キーワードの後にはコロン)
int exFunction(int ex3){return ex3;}//インライン定義で実装記述を終える
};//文末にはセミコロンをつける。
↑先ほど、グローバル領域にて記述した処理記述と同じ内容
return ex3
をインライン定義に変更したサンプルコードです。
int exFunction(int ex3)
というメンバ関数の名前と、引数の設定を終えた後にそのまま{}をもってきて、{}内に処理実装記述を施しました。
「なんか、こっちの方が簡単じゃない?わざわざグローバル領域で処理記述をする意味なくない?」
と思われる方もいるかもしれません。
しかし、実際にクラスを利用とするときは、もっとたくさんのメンバ関数を一つのクラスにまとめるので、いちいちクラス内で複雑な記述をしていたら混乱してしまいます。
したがって、インライン定義式の記述は今回のサンプルコードのような一文で完結する場合のみにとどめておくのが無難でしょう。
※なお、メンバ関数の実装記述をインライン定義で済ませる場合、{}の後のセミコロンは任意です。
ややこしいのですが、{}内の実装記述にはセミコロンは必須です。
インライン定義時の{}内外記述はif文やfor文と同じルールだと言い換えることもできます。
一応動画を撮ってみましたので参考にしてください。↓
※インライン定義はこの後出てくる、仮想関数という概念の時に出てきます。具体的な使い方がまだピンと来ていない方もご安心ください。今後出てくる以下の記事群を参考にしていただければと思います。
・MQL5 EA講座 第53回「クラスについて6 -仮想関数-」
・MQL5 EA講座 第109回「インジケータの値を簡単に取得できるクラスを作る」
クラスの使い方
//exampleClassインスタンス「exmaple」を宣言
exampleClass examaple;
void OnStart()
{
int x=0;
//exmaple「exmaple」インスタンスからexFunctionを呼び出す
x=examaple.exFunction(3);
Print(x);
}
↑「exampleClass」というのは、ユーザ定義型のデータ型と同じです。
int型やdouble型、string型などと同じように「exampleClass」というデータ型を作ったという事を意味します。
次にやることは、そこからインスタンス(クラスの変数名みたいなもの)の名前をつけることです。
サンプルコードでは「exmaple」としました。
※インスタンスについては、MQL5 EA講座 第22回「構造体」 でも説明をしました。
インスタンスと言うのは”実体”という意味の英単語です。クラス「exampleClass」を実際に利用させるために実体化させたものがインスタンス「exmaple」というということになります。
これで、クラス内のメンバーを利用する準備が整いました。
インスタンス名である、exampleを記述した後にドット(.)を書いて呼び出したいメンバーを記述します。↓
OnStart関数内に、
インスタンスexampleを記述して、その後ドット(.)を書き、メンバ関数であるexFunctionを呼び出します。
各メンバには変数や関数と同じく、エディタのオートコンプリート機能が働くので、全部自分で入力しなくても、機能が提示する選択肢からメンバを選択することも可能です。
実引数には「3」をあてがい、変数「x」に代入したものをPrint関数でログ出力してみると、
exFunction関数の機能が、
なので、予想通り「3」が出力されました。
をご覧ください。
まとめ
今回は クラスの使い方 について解説しました。
今回の記事では以下のことを学びました
—————————————————————————————————-
・クラスのメンバ関数の処理実装記述をグローバル領域で行う場合、
戻り値のデータ型 クラス名::関数名(引数のデータ型 引数 { //処理記述 }
という順で記述する。
・クラス名の後にダブルコロン(::)を記述し、その後に関数名を書くことによって、クラス所属のメンバ関数であることを意味する。
・関数の実装記述が、簡易なものであれば、グローバル領域ではなく、クラスの{}内でしても差し支えない(インライン定義)
・クラス内の各メンバを呼び出すときには、インスタンスの後に、ドット(.)を書いて呼び出したいメンバを記述する。
———————————————————————————————————
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
【超入門】MQL5 EA講座 第48回「クラスについて1 -クラスとは?-」【EAの作り方】←
→【超入門】MQL5 EA講座 第50回「クラスについて3 -アクセス指定子-」【EAの作り方】
※クラスの実際の使用例に関しては、今後の講座記事にはなりますが、以下の記事で解説していますので、今はよくわからなくてもご安心ください。
・MQL5 EA講座 第71回「トレード用のオリジナルクラスを作る」
・MQL5 EA講座 第82回「ポジション情報管理クラスを作る-その1」
・MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」
・MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」
・MQL5 EA講座 第96回「トレーリングストップクラスを作る1」
コメント