0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

オブジェクト指向プログラミングPart2 コンストラクタとデストラクタ MQL5

Last updated at Posted at 2021-08-16

← オブジェクト指向プログラミングPart1

##コンストラクタとデストラクタ
 __コンストラクタ__とはオブジェクトが生成されたときに1度だけ実行されるメソッドで、__デストラクタ__はオブジェクトが消去されたときに実行されるメソッドです。前回作成したクラスにコンストラクタとデストラクタを書き加えて、その動作を確認していきます。

実行されるタイミング
コンストラクタ オブジェクト生成時
デストラクタ オブジェクト消去時

###コンストラクタ、デストラクタの書き方
image.png

実際にコードを書いてみると

.c
class CRen{
private: 
   int AI;

public: 
   int get_AI() { return AI; };
   void set_AI(int ai) { AI = ai; };
   
   CRen(){ Print("コンストラクタ"); } // コンストラクタ

   ~CRen(){ Print("デストラクタ"); }  // デストラクタ

};

int OnInit()
  {
   CRen ren; // オブジェクト生成
   
   ren.set_AI( 1234 );
   Print( ren.get_AI() );
   
   return(INIT_SUCCEEDED);
  }

このプログラムを実行すると↓
image.png
コンストラクタとデストラクタが動作の最初と最後に実行されていることがわかります。

今度は__OnInit関数__ではなく__OnTick関数__でクラスを呼び出してみます。

.cpp
class CRen{
private: 
   int AI;

public: 
   int get_AI() { return AI; };
   void set_AI(int ai) { AI = ai; };
   
   CRen(){ Print("コンストラクタ"); } // コンストラクタ
   ~CRen(){ Print("デストラクタ"); }  // デストラクタ
};

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   CRen ren; // オブジェクト生成
   
   ren.set_AI( 1234 );
   Print( ren.get_AI() );
   
  }

このプログラムを実行すると↓
image.png
 OnTick関数は1ティックごとに実行される関数なのでオブジェクト生成/消去も1ティックごとに起こります。そのため1ティックごとにクラスのコンストラクタとデストラクタが実行されることになります。

##メソッドの宣言と定義付けを分けて書く
 メソッドの宣言とと定義を分けて書くことも可能です。クラス内部のメソッドをたくさん作りたい。もしくはメソッドの内容が長くなるときは、メソッドの宣言とと定義を分けて書くとコードが見やすくなったりします。
###書き方
 クラス内部のメソッド宣言で
image.png
 クラスの外側で
image.png

実際にコードを書いてみると

.cpp
class CRen{
private: 
   int AI;

public:    
   int get_price(); // メソッドの宣言
   
};

// メソッドの定義付け
int CRen::get_price(void)
{
   AI = 100 + 20;
   
   return AI;
}

int OnInit()
  {
   CRen ren; // オブジェクト生成
   
   Print( ren.get_price() );
   
   return(INIT_SUCCEEDED);
  }

このプログラムを実行すると↓
image.png

###コンストラクタとデストラクタもクラスの外部で定義付けしてみる
コンストラクタとデストラクタの場合はメソッドの定義で型をつける必要がありません。そのほかに書き方に違いはありません。

.cpp
class CRen{
private: 
   int    AI;
   double SA;

public: 
   int get_AI() { return AI; };
   void set_AI(int ai) { AI = ai; };
   
   CRen();   // コンストラクタ
   ~CRen();  // デストラクタ
};

CRen::CRen(void)
{
   SA = iClose(_Symbol,PERIOD_CURRENT,0);
   Print("コンストラクタ 現在の価格は ",SA);
}

CRen::~CRen(void)
{
   Print("デストラクタ SAの値は ",SA," AIの値は ",AI);
}


int OnInit()
  {
   CRen ren; // オブジェクト生成
   
   ren.set_AI( 1234 );
   Print( ren.get_AI() );
   
   return(INIT_SUCCEEDED);
  }

このプログラムを実行すると↓
image.png


続きを読むときはこちら
オブジェクト指向プログラミングPart3 →

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?