改めて前回の内容をおさらいをしておくと、
- 仮想関数とは、「派生クラスでは、継承した関数の処理内容を少し変えたい」「大まかな処理内容だけ元のクラスで決めて、細かい処理内容は、各派生クラスで決めたい」という意図がある場合に用いる、関数のことである。
ということをお伝えしました。
今回は インスタンス という概念についてお話ししたいと思います。
インスタンスとは?
インスタンスについては、既に構造体、クラスの回で出てきており、その都度端的な説明はしてきました。↓
MQL5 EA講座 第48回「クラスについて1-クラスとは?-」
従って、「改めて1つの単元として取り上げる必要もないかな?」とも思ったのですが、逆にいえば、その都度出てくる程、大事な概念でもあるため、復習とまとめを兼ねて、今回改めて取り上げる事にしました。
インスタンスとは、構造体、クラスなどを実際に利用する時に宣言する変数名のようなものです。
※インスタンスのことは、「オブジェクト」とも言ったりもしますが、MQL4やMQL5において「オブジェクト」というと、チャート上に表示する描画物の事を想起しがちなので、このサイトでは、なるべくインスタンスという言葉を使いたいと思います。
例えばint型やdouble型、string型の変数を宣言する場合、↓
int 変数名;
double 変数名;
string 変数名;
このようになりますよね?
構造体やクラスも、データ型の1つです。int型やdouble型、string型との違いは、データの種類を自身でカスタマイズできる事だ、というのは構造体、クラスそれぞれの記事で既に書いてきました。
int型やdouble型、string型を使うのに変数名を宣言する必要があるように、クラスや構造体を利用する時には、インスタンス名を宣言する必要がある、ということです。
struct 構造体名
{
//メンバを記述
};
構造体名 インスタンス名;
class クラス名
{
//メンバを記述
};
クラス名 インスタンス名;
↑構造としてはこんな感じですね。
実際のコードに落とし込むと↓のようになります。
//クラスの宣言
class exampleClass
{
public:
int publicInteger;
};
//クラスインスタンスの宣言
exampleClass exClass;
//構造体の宣言
struct exampleStructure
{
int exampleInteger;
};
//構造体インスタンスの宣言
exampleStructure exStructure;
void OnStart()
{
}
上記のサンプルコードで言えば「exampleClass」がintやdoubleといったデータ型で、exClass(これがインスタンスになる訳ですが)が変数名と読み替えることもできます。↓
構造体やクラスは、ある種の設計図のようなものであり、それ自体は具体的なデータを持ちません。
インスタンスを作成することで、その設計図に基づいた実際のオブジェクトがメモリ上に生成され、具体的なデータや状態を保持できるようになるわけです。
インスタンスの使い方
インスタンスの宣言ができたら、構造体やクラスが晴れて使えるようになります。
しつこいようですが、もう一度前提を確認
でしたね。
そして、構造体やクラスにおける、個々の変数や関数のことをメンバと言います。
インスタンスの後ろにドット(.)をつけて、その後に呼び出したいメンバの名前を記述します。
//クラスの宣言
class exampleClass
{
public:
int publicInteger1;
int publicInteger2;
int publicInteger3;
void publicFunction(){Print(publicInteger1);};
};
//クラスインスタンスの宣言
exampleClass exClass;
//構造体の宣言
struct exampleStructure
{
int exampleInteger;
double exampleDouble;
string exapleString;
};
//構造体インスタンスの宣言
exampleStructure exStructure;
void OnStart()
{
//クラスインスタンスからメンバの呼び出し
exClass.publicFunction();
exClass.publicInteger1;
//構造体インスタンスからメンバの呼び出し
exStructure.exampleDouble;
exStructure.exampleInteger;
}
クラスのインスタンスであるexClass、構造体のインスタンスであるexStructureをそれぞれまずは生成しました。
———————————
※サンプルコード内で宣言した「exampleClass」クラスの{}内に書かれている「public」というのはアクセス指定子です。アクセス指定子とは、クラス内の変数や関数(メンバ)の利用有効範囲(アクセスレベル)を決めるためのものです。
詳細については以下の記事をご参照ください。
・MQL5 EA講座 第50回「クラスについて3 -アクセス指定子-」
———————————
OnStart関数内で、それぞれのインスタンスを記述後、ドット(.)を書き、それぞれのメンバを呼び出しています。↓
インスタンスは、必要に応じて複数個宣言することができます。
int型やdouble型、string型の変数が1個しか宣言できないなんてことはないですよね?
繰り返し述べている通り、インスタンスはクラスや構造体における変数名なわけですから、そこは同じ理屈が働きます。↓
インスタンスとコンストラクタの関係
コンストラクタについては、↓
MQL5 EA講座 第52回「クラスについて5 -コンストラクタ-」
で解説をしているので、未読の方は是非こちらも読んでいただければと思います。 <m(__)m>
コンストラクタというのは、「クラスのインスタンスの生成時に発動する関数」のことです。
普通のメンバは、インスタンスを生成した後、個別に呼び出さなくてはいけないのですが、コンストラクタについてはインスタンスを生成した段階で関数処理を実施します。
↑はコンストラクタの講座記事でもお見せした動画ですが、注目していただきたいのは、イベントハンドラーであるOnStart関数で一切呼び出していないのにログ出力を実施しているところです。
このように、切り分けをしていただければと思います。
まとめ
今回は インスタンス について解説しました。
今回の記事では以下のことを学びました
- インスタンスとは、構造体、クラスなどを実際に利用する時に宣言する変数名のようなものである。
- インスタンスは、必要に応じて複数個宣言することができる。
- クラスや構造体のメンバを呼び出すには、インスタンスの後ろにドット(.)をつけて、その後に呼び出したいメンバの名前を記述する。
- 普通のメンバは、インスタンスを生成した後、個別に呼び出さなくてはいけないが、コンストラクタはインスタンスを生成した段階で関数処理を実施する。
今回は以上になります。
最後までお読みいただきありがとうございました<m(__)m>
※なお、インスタンスを使ったEAの具体的な記述例については、
・第110回「インジケータ取得クラスに派生クラスを追加する」
で解説予定です。
コメント