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

 
Igor Makanu:

は、OOPスタイルのコードとの戦いの結果を見て、うーん...と思いました。善哉善哉))))


質問があるのですが、私のコードでは、まあ正確には3回ですが、こんな構文を使っています。

はすべてprivatメソッドで呼び出しますが、CheckPointer(m_order)==POINTER_INVALIDからソースコード上で逃れるための「Jediメソッド?

いくつかのget/setについて質問しています。

特別な問題はなく、いわば気まぐれで、C++のOOPメソッドの知識への渇望がまだ衰えていないうちは

もし質問が「多くの文字」であれば, !CheckPointer(mPtr) とし,関数呼び出しの 場合は,コンストラクタですべてのポインタを NULL に初期化し,コード内でそれと比較し, ptr; を削除するときに忘れないようにします.

 
Igor Makanu:

は、OOPスタイルのコードとの戦いの結果を見て、うーん...と思いました。善哉善哉))))


質問があるのですが、私のコードでは、まあ正確には3回ですが、こんな構文を使っています。

はすべてprivatメソッドで呼び出しますが、CheckPointer(m_order)==POINTER_INVALIDからソースコード上で逃れるための「Jediメソッド?

いくつかのget/setについて質問しています。

特別な問題はなく、いわば気まぐれで、C++のOOPメソッドの知識への渇望がまだ衰えていないうちは


イゴール、この例を見て くれ、そういうことなんだろう。

 
Vladimir Simakov:

もし質問が「多くの文字」であれば, !CheckPointer(mPtr) とし,関数呼び出しの 場合は,コンストラクタですべてのポインタを NULL に初期化し,コード中でそれと比較し, ptr を削除するときは忘れずに ptr=NULL にします.

まあ、それとこれ、砂糖のため。

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

特に問題はないのですが、気まぐれというか、C++でOOPメソッドを学びたいという渇望がまだ枯れていないうちは、そうしていました。

コンストラクタで、クラスのすべてのフィールドをデフォルト値で初期化することを強くお勧めします。要は、これをやりたいのであれば

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

nobody はクラスのフィールドを初期化するので、ゴミのような値になってしまいます。

 
Vladimir Simakov:

そして、これ、砂糖の場合。

いや、定義についてはほとんどあきらめていて、数週間前に書いたように、何もラップしたくないだけなんです。とりあえず純粋なOOPスタイルのコードを見て、柔軟性と可能性を評価したいんです

HH: 3行で同じ初期化を書かないように、子孫をdefineでラップして、後でメソッドを追加しやすいようにした。

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
ローマン


イゴール、この例を見て くれ、君が求めているのはそれだと思う。

いいえ、私はC#で同等のものを意味します - 演算子?( null-join 演算子 ) のような、C++ スタイルで見たいロジックに近いもの。


UPDです。

ウラジミール・シマコフ

コンストラクタで、クラスのすべてのフィールドをデフォルト値で初期化することを強くお勧めします。要は、これをやりたいのであれば

マクロを求めるなら、誰もクラスのフィールドを初期化しないし、ゴミのような値も出てくる。

ということで、コンストラクタはベースクラスのあらゆるものを初期化し、子孫はベースクラスを初期化するようにしました。

ということで、ちゃんと初期化し忘れないようにマクロで包んでおきました )))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

いや、定義についてはほとんどあきらめていて、数週間前に書いたように、何もラップしたくないだけなんです。とりあえず純粋なOOPスタイルのコードを見て、柔軟性と可能性を評価したいんです

ZS:生成時にdefineで子孫をラップするだけ、同じ初期化を3行で書かない、後でメソッドを追加しやすい、つまりソースコードでは今のところ1行で済む。

いいえ、私はC#で同等のものを意味します - 演算子?( null-join 演算子 ), C++ スタイルのロジックで似たようなものが欲しいです。

プリプロセッサーがもったいない。テンプレートと並んで、最強のツールです。演算子のアナログはないようです。この点では、C++の方がよりハードコアです。
 
Vladimir Simakov:
プリプロセッサの拒否は無駄です。テンプレートと並んで、最も強力なツールです。演算子のアナログはないようです。この点では、C++の方がよりハードコアです。

私はまだ純粋なOOPスタイルの戦いの中にいます、私はフォーラムに資産がある間に、すべてのOOPテクニックを学びたい;)

プリプロセッサーでスピードアップしたが、、、。少なくとも、私のスタイルでは、悪用しない方がいいと思います。失敗するかもしれないし、確かに複数のマクロ置換があるコードを読むことはできないでしょうし、バグをどう探すか・・・まあ、書き直す方が簡単ですから、まだ必要ないですね


テンプレート...まあ、SBで開発者が提供するものが気に入らない、全部目を通したが、何のためにSBに入れたのかわからない、まだその時が来ていないのかもしれない。

C++テンプレートのMQLへの移植について - 議論が示すように、ほとんどの場合、C++テンプレートはMQL用に微調整が必要です - .dllに戻ってMQLを気にしない方が簡単です )))

 
Igor Makanu:

私はまだ純粋なOOPスタイルの戦いの中にいます、私はフォーラムに資産がある間に、すべてのOOPテクニックを学びたい;)

プリプロセッサーでスピードアップしたが、、、。少なくとも、私のスタイルでは、悪用しない方がいいと思います。失敗するかもしれないし、確かに複数のマクロ置換があるコードを読むことはできないでしょうし、バグをどう探すか・・・まあ、書き直す方が簡単ですから、まだ必要ないですね


テンプレート...まあ、SBで開発者が提供するものが気に入らない、全部目を通したが、何のためにSBに入れたのかわからない、まだその時が来ていないのかもしれない。

C++テンプレートのMQLへの移植について - 議論が示すように、ほとんどの場合、C++テンプレートはMQL用に微調整が必要です - .dllに戻ってMQLを気にしない方が簡単です )))

そうすれば、自分でテンプレートを書くことができますよ))
 
Vladimir Simakov:
自分でそのようにテンプレートを書けばいいのです)))

Yup )))

私はヘルプを読み終えて、オーバーライドをスキップしました、すべてがマクロであることに感謝し、編集、まあ、正確に1つのコピーペーストで

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPDです。

そうではなく、パーミッション制御のために出てきたもので、パブリックメソッドは必要ありません。

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

そして、砂糖にはこれ。

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

ではなく、昔持っていたものを書きたかったのです。

if( CheckPointer(m_order)==POINTER_INVALID )

という感じでした。

if(m_order==NULL)

が、MQLでマクロ置換を確認する方法を思い出しました。

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID= 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


そして、私の記憶が正しければ、今年の初めには、NULLをログにアンプリンターすることができ、そこで0を得ることができましたが、今ではエラーが表示されるようになりました。

つまり、NULLの挙動は今後も変わらないはずですが、NULLの代わりに何が代入されているのかが不明です。おそらく、この状況を今チェックすると、if(CheckPointer(m_order)==POINTER_INVALID)) と書かれているように、 正しいコードと言える でしょう))