1
2

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.

オブジェクト指向プログラミングPart1 カプセル化、クラスの書き方 MQL5

Last updated at Posted at 2021-08-16

オブジェクト指向とは簡単に…

 オブジェクトとはデータと機能をまとめたものをいいます。普通に1個ずつプログラム書くより、オブジェクトを作って必要なもの呼び出して使う方が良さそうに思いませんか?ざっくりとしたイメージですが、このようなシステムの開発を効率よく進めるための考え方がオブジェクト指向です。
 オブジェクト指向とは明確な定義のない「概念」、「考え方」です。オブジェクト指向を学ぶ前にオブジェクト指向とは何かをしっかり理解する必要はなく、多くの人はふわっとしたまま学んでいって少しずつイメージを掴んでいくものではないでしょうか。
 ここではいくつかのPartに分けながら3大要素である カプセル化継承ポリモーフィズム を中心にオブジェクト指向プログラミングについて説明と書き方を解説していきます。

クラスとは

 クラスとは変数や変数を一つにまとめたもの、カプセル化 と言ったりもします。例えばEAの作成時によく使う関数とその関数で使う変数を一つのクラスにまとめる。また別でインジケータの作成時によく使う関数とその関数で使う変数を一つのクラスにまとめる。というように用途に応じてクラスを作成しておくと、関数をバラバラに管理するよりもスッキリするわけです。
image.png

構造体はクラスの変数だけ版

 クラスを書く前に構造体の書き方について知っておくといいです。 クラスは変数や関数を一つにまとめたもの と説明しましたが、構造体はクラスから関数を除いて、 複数の変数を一つにまとめたもの になります。

.cpp
// StrRenという名前の構造体を作成
struct StrRen{
   // ここに構造体にまとめる変数を書く
   int    ren_a;
   double ren_b;
   string ren_c;
};

 これでStrRenという名前の構造体を使用できるようになりましたので実際にEAのOnInit関数で使ってみましょう。

構造体を使うときは

  1. 使いたい構造体の名前を指定してオブジェクトを生成する
  2. オブジェクト.変数名 で構造体内部の変数を呼び出す

image.png

なのでプログラムは

.cpp
// StrRenという名前の構造体を作成
struct StrRen{
   // ここに構造体にまとめる変数を書く
   int    ren_a;
   double ren_b;
   string ren_c;
};
int OnInit()
  {
   StrRen ren; // オブジェクト生成
   
   ren.ren_a = 10;    // 構造体の変数を呼び出す
   ren.ren_b = 2.1;   // 構造体の変数を呼び出す
   ren.ren_c = "abc"; // 構造体の変数を呼び出す
   
   Print(ren.ren_a);
   Print(ren.ren_b);
   Print(ren.ren_c);
   
   return(INIT_SUCCEEDED);
  }

動作させると↓
image.png

クラスを作ってみる

.cpp
// CRenという名前のクラスを作成
class CRen{
private: // ここでクラス内部で使う変数を用意する
   int AI;

public: // ここにクラスにまとめる関数(メソッド)を書く
   int get_AI() { return AI; };
   void set_AI(const int ai) { AI = ai; };
};

 これで int get_AI()void set_AI(int ai) の二つの関数(メソッド)をまとめたクラスを作成できました。ちなみにクラス内の関数をメソッドと呼びます。

クラスを使うときは

  1. 使いたいクラスの名前を指定してオブジェクトを生成する
  2. オブジェクト.関数名 でクラス内部の関数(メソッド)を呼び出す

image.png

なのでプログラムは

.cpp
// CRenという名前のクラスを作成
class CRen{
private: // ここでクラス内部で使う変数を用意する
   int AI;

public: // ここにクラスにまとめる関数(メソッド)を書く
   int get_AI() { return AI; };
   void set_AI(const int ai) { AI = ai; };
};

int OnInit()
  {
   CRen ren; // オブジェクト生成
   
   ren.set_AI( 1234 );    // クラスの関数(メソッド)を呼び出す

   Print( ren.get_AI() ); // クラスの関数(メソッド)を呼び出して画面出力(Print関数)

   return(INIT_SUCCEEDED);
  }

動作させると↓
image.png

オブジェクト生成を省略して書く

.cpp
// CRenという名前のクラスを作成
class CRen{
private: // ここでクラス内部で使う変数を用意する
   int AI;

public: // ここにクラスにまとめる関数(メソッド)を書く
   int get_AI() { return AI; };
   void set_AI(const int ai) { AI = ai; };
}ren;  // ←ここでオブジェクト生成

int OnInit()
  {
   ren.set_AI( 1234 );    // クラスの関数(メソッド)を呼び出す

   Print( ren.get_AI() ); // クラスの関数(メソッド)を呼び出して画面出力(Print関数)

   return(INIT_SUCCEEDED);
  }

 さっきのプログラムと同じものですがOnInit関数内でオブジェクト生成文を記述していません。クラスを定義したところの最後に ren と書き加えることで、以降 ren オブジェクトを使用できるようになります。こういう書き方もできるという話でした。

 クラスの書き方とクラス内の関数(メソッド)を呼び出す方法さえ知っていれば、とりあえず使うことができます。よく似た用途の関数をクラスにまとめてみるのもいいかと思います。


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

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?