mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 26

 
Alexey Kozitsyn:
あなたの説明では、これらの設定を別個のものとして、すべてのマネージャー以降に同じものを用意するのが理にかなっていると思います
 
TheXpert:
あなたの説明によると、これらの設定を別のエンティティに分離することは理にかなっており、すべてのマネージャに同じであり、唯一のものではありません。

はい、マネージャーを必要とするクラスは、マネージャーフィールドへのゲッターを持つベースクラスから継承する必要があるようです。ありがとうございます。

 
Alexey Kozitsyn:

という疑問が湧いてきました。

New Bar」クラスと「Data Manager」クラスを使用する「Program」クラスがあります。New Bar "クラスは、"Data Manager "クラスも使用しています。パブリックゲッターとセッターは "Data Manager "クラスで実装されています。

質問:「New Bar」クラスのプログラムの初期化で、「Data Manager」クラスの「symbol」「timeframe」プロパティを指定する際のオプションは何でしょうか?New Barクラスで、データマネージャフィールドにアクセスするためのパブリックゲッターとセッターを持ちたくは ありません。そして、データマネージャーを非公開にしたいと思います。

言い換えれば、アプリケーションは、データマネージャーを使用する複数のクラスを使用することができます。プログラムの初期化時に、すべてのクラスのすべてのマネージャフィールドを必要な値で初期化する必要があります。しかし、データマネージャーフィールドにアクセスするために、すべてのクラスでゲッターを作りたくはないのです。それで...

class CDataManager
   {
private:
    string          m_symbol;
    ENUM_TIMEFRAMES m_timeframe;
public:
    CDataManager():m_symbol(_Symbol),m_timeframe(_Period){}
    CDataManager(string symbol,ENUM_TIMEFRAMES frame):m_symbol(symbol),m_timeframe(frame){}
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private:
    CDataManager*  m_data;
    bool           cIsDelData;
public:
   CNewBar(CDataManager* data=NULL):m_data(!data?new CDataManager:data),cIsDelData(!data){}
   CNewBar(string symbol,ENUM_TIMEFRAMES frame):m_data(new CDataManager(symbol,frame)),cIsDelData(true){}
  ~CNewBar() {if (cIsDelData) delete m_data;}
   };
class CProgram
   {
private:
    CNewBar        m_newBar;
    CDataManager   m_data;
public:
    CProgram():m_newBar(&m_data){}
   };

そんな感じでやっています。

 
Vladimir Simakov:

だいたいそんな感じでやっています。

例題をありがとうございます。ここまでは少し複雑ですが、全般的に考え方は明確です。すぐに質問が発生:OK、もし "入れ子の1つのレベル" - ここでそれは明らかですが、入れ子のいくつかのレベルが存在する場合はどうなりますか?

追加されました。

また、なぜcIsDelDataフィールド?結局、デストラクタでm_dataをPOINTER_DINAMICに対して チェックすればいいのです。それとも私が間違っているのでしょうか?

 

継承を行うと、不要なメソッドが大量に発生します。そして、そのオブジェクトはプライベートでなければならない。そこで、信じられないかもしれませんが、最も簡単な方法は、データ・マネージャーを使用するすべてのクラスに対してセッターを設定することです。

すべてのデータマネージャが同じパラメータで動作する場合は、オブジェクトを作成せず、1つのデータマネージャへのポインタを渡す方が良い。この場合、ポインタを渡すためのセッターは1つだけでよい。

 
Alexey Kozitsyn:

例題をありがとうございます。ここまでは少し複雑ですが、全般的に考え方は明確です。すぐに質問が発生:OK、もし "入れ子の1つのレベル" - ここでそれは明らかですが、入れ子のいくつかのレベルが存在する場合はどうなりますか?

追加されました。

また、なぜcIsDelDataフィールド?結局、デストラクタでm_dataをPOINTER_DINAMICに対してチェックすればいいのです。それとも私が間違っているのでしょうか?

いいえ、あなたは間違っています。動的なオブジェクトへのポインタを渡して、おっと、安全に殺すことができるのです。
そして、巣立ちについて。上の例のように、最初に必要な場所にオブジェクトのインスタンスを作成し、さらにポインタだけを作成します。一般的にプロジェクト 内でシングルトンを想定しているのであれば、シングルトンを作ればいいのですが、私はmqlを使って作ったことがないので、必要ないですね、試してみないと。
 
Dmitry Fedoseev:
ウラジミール・シマコフ

ありがとうございます、考えてみます。

 
Vladimir Simakov:

だいたいこんな感じでやっています。

このCDataManager* m_data の行の意味するところ。

みんな......こういうのやりたいんだ。マクロがあるんです。

#define  foor(a,b,v) \
for(;Funkziya(a,b,v);b++)
//я хочу доработать макрос чтобы получилось так
#define  foor1(a,b,v,g) \
//за основу будет взят первый макрос
for(;Funkziya(a,b,v)&&g;b++)//эффект должен быть такой где g это дополнительное выражение которое будет дописываться в новый макрос

その結果、foorとfoor1という 2つのマクロを持つことになります。

 
Seric29:

このCDataManager* m_data の行の意味するところ。

みんな......こういうのやりたいんだ。マクロがあるんです。

その結果、foorとfoor1という 2つのマクロを持つことになります。

オブジェクトへのポインタ。

悪気はないのですが、そんなマクロに手を出すのは早計です。まず、私がなぜこのようなことをしたのか、理解してください。

#define  foor1(a,b,v,g) \
for(;Funkziya(a,b,v)&&(g);(b)++)
 
Vladimir Simakov:

オブジェクトへのポインタ。

悪気はないんだけど、こんなマクロじゃ早すぎるよ、泥沼にはまるよ。まず、なぜこのような方法をとったのかを理解してください。

そして、このポインタをクラス内のオブジェクトに渡してどうするのか。

また、マクロに関しては、より簡単に作業できるようになりました。

理由: