MQL5におけるOOPに関する質問 - ページ 36

 
Igor Makanu:

そうですね、その方が良い解決策です!そうすれば、メソッドが1つ減りますから。

OnStartのnewは1つしかないはずです。
 
Koldun Zloy:

1.この関数を2回呼んでも何も問題はありません。

2.静的関数を使うことに反対している人たちが、微塵も反論しないのは気にならないのでしょうか?

誰でもいいからビデオを見るのではなく、本を読んだ方がいい。

私は ビデオの著者https://youtu.be/lfdAwl3-X_c とhttps://youtu.be/zME4SOCHT0I 多くの良いことを望む...... 今週全体をノックアウトし、私が行うために座っているすべては、私は以前のようにやっていない、考え始める... ...スタティックは使えません。

コードを完成させたいのですが、質問があります。

- オブジェクトのフィールドを保存したいのですが、良いことに、フィールドはすぐに構造体に配置され、FileWriteStruct()を介してワンクリックで保存することができます。

- 一つのクラスからN個のオブジェクトがあり、それらはすべて一つのベースクラスから継承される。

- ビデオで見たので、ファイルを保存する必要がある場合、各オブジェクトに問い合わせる必要がない方法があればと思ったのですが......。一般的に、大失敗は、愚かなことをしないことに決定し、ファイルに書き込むためのフラグを静的に割り当てるメソッドを作成することになりました

class CStrategy: public IStrategy
{
protected:
static bool       f_save_required;
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

計画通りに動作する

そして、こう書いたらどうなるんだろうという疑問そのもの。

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

このように書くと、どうなるか。

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { f_save_required = true                   }
public:
bool              GetSaveRequired()        { return(f_save_required);                   }
 

テストスクリプトを変更するために別の方法を試してみましたが、私は違いを見ることができません、私は上記の投稿に正しい修飾子を示して ください:(保護/プライベート)とM::xまたは単にxを呼び出す

//+------------------------------------------------------------------+
interface I
{  bool main();

};
//+------------------------------------------------------------------+
class M:public I
{
protected:
static int        x;
bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

void OnStart()
{  I *a = new A;
   I *b = new B;
   I *c = new C;
   I *m = new M;

   a.main();
   b.main();
   c.main();
   m.main();


   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+
 
Igor Makanu:

テストスクリプトを変更するために別の方法を試してみましたが、私は違いを見ることができません、私は上記の投稿に正しい修飾子を示して ください:(保護/プライベート)とM::xまたは単にxを呼び出す

protectedの場合、フィールドが定義されているクラスのメソッドでのみ参照が可能ですが、ここではロジックは共通です。
 
ところで、ハッピーホリデー。またバイトが発生しました。
 
Vladimir Simakov:
クラスメソッドの 内部ではxを呼び出し、他のすべての場所ではM::x、もしprotectedなら、フィールドが定義されているクラスのメソッドでのみアクセスが可能です、ここではロジックは共通です。

そうなんです!寝起きで間違った例を作ってしまったので、'M::main' - cannot access private member function.と出てしまいました。

class M
{
private:
   static int        x;
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
void OnStart()
{  A *a = new A;
   B *b = new B;
   C *c = new C;
   M *m = new M;

   a.inc();



   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+

got 'M::main' - cannot access private member function tst.mq5 25 32

書き出すと

protected:   
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }

すべて計画通りに動いています

 
Vladimir Simakov:
ところで、ハッピーホリデー。 またバイトが起きた。

ありがとうございます!解決しました。

Happy Holidays!

 
Igor Makanu:

私は ビデオの著者https://youtu.be/lfdAwl3-X_c とhttps://youtu.be/zME4SOCHT0I 多くの良いことを望む...... 今週ずっとノックアウト、私が行うために座っているすべては、私はむしろ以前のように行うよりも考え始める... ...スタティックは使えません。

コードを完成させたいのですが、質問があります。

- オブジェクトのフィールドを保存したいのですが、良いことに、フィールドはすぐに構造体に配置され、FileWriteStruct()を介してワンクリックで保存することができます。

- 一つのクラスからN個のオブジェクトがあり、それらはすべて一つのベースクラスから継承される。

- ビデオで見たので、ファイルを保存する必要がある場合、各オブジェクトに問い合わせる必要がない方法があればと思ったのですが......。一般的に、大失敗は、愚かなことをしないことに決定し、ファイルに書き込むためのフラグを静的に割り当てるメソッドを作成することになりました

計画通りに動作する

そして、こう書いたらどうなるんだろうという疑問そのもの。

このように書くとどうなるか。

オブジェクトをファイルに保存する必要があるかどうかは、何に依存するのでしょうか?

このフラグはすべてのオブジェクトで共通なのでしょうか?

 
Koldun Zloy:

オブジェクトをファイルに保存するには、何に依存するのでしょうか?

これは、すべてのオブジェクトに共通する機能なのでしょうか?

もちろん、問題は弁証法的である。

- 10個のストラテジーを用意し、TCの状態を変えながら10個のファイルを書くとよい(1個のTC=1個の構造体)。

- または、クラスから1つのハンドルを渡す方が論理的で、1ティックごとにストラテジーの呼び出し(検索)があり、1つのファイルに書き込まれます。

2番目のバリエーションがより論理的だと思います


すべてのTCの開始後、10個の構造体を一度書き込む必要があることが判明した - 状態が変化している

この場合、ファイルを開いて 一度に10個の構造を書き込む方が速い。戦略はピップスワイズではなく、毎秒でもなく、各TSで1分から1時間程度である。


これまでのところ、スタティック変数の記述と、get - set, set protected, get publicによるアクセスを実装しています - また、呼び出し後にスタティック変数をfalseにリセットしています。

 
Igor Makanu:

まあ、問題は弁証法的である、もちろん、ここで

- 10個のストラテジーを持ち、TCの状態を変化させて10個のファイルを書く(1個のTC=1個の構造体)。

- または、クラスから1つのハンドルを渡す方が論理的で、そこではティック上でストラテジーの呼び出し(検索)が行われるため、1つのファイルにすべてを書き出します。

2番目のバリエーションがより論理的だと思います


すべてのTCの開始後、10個の構造体を一度書き込む必要があることが判明した - 状態が変化している

この場合、ファイルを開いて 一度に10個の構造を書き込む方が速い。戦略はピップスワイズではなく、毎秒でもなく、各TSで1分から1時間程度である。


今のところ、静的変数へのアクセスは、get - set、set protected、get publicで行うように記述しています。

これですべてクリアです。SetSaveRequired()とGetSaveRequired()が非スタティックでありながら、スタティック変数に書き込む 理由は不明です。