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

# オブジェクト指向とは簡単に…
　オブジェクトとはデータと機能をまとめたものをいいます。普通に1個ずつプログラム書くより、オブジェクトを作って必要なもの呼び出して使う方が良さそうに思いませんか？ざっくりとしたイメージですが、このようなシステムの開発を効率よく進めるための考え方がオブジェクト指向です。
　オブジェクト指向とは明確な定義のない「概念」、「考え方」です。オブジェクト指向を学ぶ前にオブジェクト指向とは何かをしっかり理解する必要はなく、多くの人はふわっとしたまま学んでいって少しずつイメージを掴んでいくものではないでしょうか。
　ここではいくつかのPartに分けながら3大要素である __カプセル化__ 、__継承__、 __ポリモーフィズム__ を中心にオブジェクト指向プログラミングについて説明と書き方を解説していきます。
# クラスとは
　クラスとは変数や変数を一つにまとめたもの、__カプセル化__ と言ったりもします。例えばEAの作成時によく使う関数とその関数で使う変数を一つのクラスにまとめる。また別でインジケータの作成時によく使う関数とその関数で使う変数を一つのクラスにまとめる。というように用途に応じてクラスを作成しておくと、関数をバラバラに管理するよりもスッキリするわけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/b7f9c68c-618d-67de-798e-929e2cbd11ba.png)
## 構造体はクラスの変数だけ版
　クラスを書く前に構造体の書き方について知っておくといいです。 __クラスは変数や関数を一つにまとめたもの__ と説明しましたが、構造体はクラスから関数を除いて、 __複数の変数を一つにまとめたもの__ になります。

```.cpp
// StrRenという名前の構造体を作成
struct StrRen{
   // ここに構造体にまとめる変数を書く
   int    ren_a;
   double ren_b;
   string ren_c;
};
```
　これでStrRenという名前の構造体を使用できるようになりましたので実際にEAのOnInit関数で使ってみましょう。

## 構造体を使うときは

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/a0a54c0a-143f-c10b-f1cd-eb130dba7b10.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/63e5f61a-684a-bb62-1845-cc12b5d9e44d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/18e33519-d0ea-265f-23a7-13d6198a1e6f.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1882169/6495bfa4-61bc-b269-1797-cec4f4507fa3.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 コンストラクタとデストラクタ →](https://qiita.com/aisaki180507/items/2bdc3898391ebcc7acbd)