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

 
Igor Makanu:

そこで何を初期化するかは問題ではなく、int 型であっても、この特定のコンストラクタを呼び出すための任意の数です。

を選んだのは、誤植を避けるためで、任意の桁、つまり0.0を選びました。

0

が、そういうわけでもない))) 今、普通にコードを見ただけで、まだ異常な見方があるのだ)))
 
Alexandr Andreev:

0

ノー

0.0としか書いていない - 他の数値は期待されていない - コンストラクタに変数さえない

一般に、おしゃれな作家のスタイルとして、もしかしたら、ベストではないかもしれない。

 
Alexandr Andreev:

ポイントはx)ではなく、受け手にfloatが存在する可能性があり、0.0を指定するのも信頼性がないことです

0.0はコンパイラにとって曖昧さのないdouble、floatは0.fとなります。
 
Vladimir Simakov:
0.0はコンパイラにとって曖昧さのないdouble、floatは0.fとなります。

クレジット)

 

50歳以上の質問」のコーナーが開いている間に、私もキャストの話題に口を挟ませてください。

- フォールトトレランスやノンリダンダンシーの観点からコードを改善する方法には、どのようなものがありますか?

-CheckPointer()!=POINTER_INVALIDのチェックは必要ですか?それとも絶対に 必要ないですか? その理由を説明してください。

- non-const に持っていくことで、const でないメソッドを呼び出すことができるようになる。Compareメソッド内でconstでないメソッドを直接呼び出すことはできますか? つまり、黄色くハイライトされた constを取り除くことができますか?

#include <ChartObjects\ChartObjectsShapes.mqh>

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public:

   void CChartObjectRectangleX(){};      
   virtual int       Compare(const CObject *node,const int mode=0) const 
   {
   CChartObjectRectangleX *n=NULL;
   const CChartObjectRectangleX*nc=dynamic_cast<const CChartObjectRectangleX*>(node);
   if(nc!=NULL)
   n=(CChartObjectRectangleX *) nc;
   if(n!=NULL) {
     if(mode==0) return CompareDate(n); 
     if(mode==1) return CompareValue(n); }return 0;    }
 
   virtual int       CompareDate( CChartObjectRectangleX *node) const { 
   //if(node!=NULL) 
      return (this.Time(1)-node.Time(1)); return 0;    }
    virtual int       CompareValue( CChartObjectRectangleX *node) const { 
   //if(node!=NULL) 
      return ((this.Price(1)-node.Price(1))*10/Point()); return 0;    }
};
 
Aleksey Mavrin:

50歳以上の質問」のコーナーが開いている間に、私もキャストの話題に口を挟ませてください。

- フォールトトレランスやノンリダンダンシーの観点からコードを改善する方法には、どのようなものがありますか?

- CheckPointer()!=POINTER_INVALIDのチェックは必要ですか?それとも絶対に 必要ないですか? その理由を説明してください。

- non-const に持っていくことで、const でないメソッドを呼び出すことができるようになる。Compareメソッド内でconstでないメソッドを直接呼び出すことはできますか? つまり、黄色くハイライトされた constを取り除くことができますか?

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public:
   virtual int       Compare(const CObject *node,const int mode=0) const
   {
   const CChartObjectRectangleX *n=dynamic_cast<const CChartObjectRectangleX*>(node);
   return !n?0: mode==0?CompareDate(n):CompareValue(n);}
   
   virtual int CompareDate(const CChartObjectRectangleX *node) const {return !node?0:int(Time(1)-node.Time(1));}
   virtual int CompareValue(const CChartObjectRectangleX *node) const {return !node?0:(int)MathRound(((Price(1)-node.Price(1))*10/Point()));}
};

文字数が少ないだけで、あなたと同じようなものです。どちらが好きかは好みの問題ですが、私は余分な変数を削除しました(コンパイラも最適化フレームワークの中で削除すると思います)。

私の「!node」チェックについて。CheckPointer(node)==POINTER_INVALID に置き換えなければならないが、これはオーバーヘッド、つまり関数呼び出しである。インライン化されていても、少なくともデリファレンスとステータスフラグのチェックはしているのです。ライブラリやコンクリートだけで、Compareメソッドを使用するプログラムを書いた場合、無効なポインタに注意するために、より良い!nodeとonのコードです。ポインタに注意するのが面倒な場合や、劣等生のためのライブラリである場合は、 CheckPointer(node)==POINTER_INVALID だけにしてください。

強調表示した const 指定子を削除すると、定数オブジェクトから これらのメソッドを呼び出すことができなくなります。

UPD: ハイライトされたチェックは、呼び出されたメソッドにあるため、削除することができます。

 
Aleksey Mavrin:

50歳以上の質問」のコーナーが開いている間に、私もキャストの話題に口を挟ませてください。

- フォールトトレランスやノンリダンダンシーの観点からコードを改善する方法には、どのようなものがありますか?

- CheckPointer()!=POINTER_INVALIDのチェックは必要ですか?それとも絶対に 必要ないですか? その理由を説明してください。

- non-const に持っていくことで、const でないメソッドを呼び出すことができるようになる。Compare メソッドの中で const でないメソッドを直接呼び出すことはできますか? つまり、黄色くハイライトされた const を取り除くことができますか?

同じ関数のメソッドを const 本体のあるものとないもので2つ書くというもので、控えめに言っても、その価値はない))))

しかし、2つの方式に出会う確率は限りなくゼロに近い......。なぜなら、CChartObjectRectangle::Priceが 存在する可能性は-bodyにconstがなければ- ありえないと思うからです。

外部からこの関数を呼び出しても、何の効果もありません。つまり、constは内部関数でのみ動作し、オブジェクトのメモリに何も書き込まれなかった(変数の値が変更されなかった)ことを確認するのです。つまり、const...中にSet(a)を呼び出すことはできないのです。しばしば、何らかの混乱の中で、この関数が何も上書きしないことを確認するために、これらのconstを素早く設定することができます(これはおそらく私の削除ですが)。

後で何かを確認しやすくするために、constはget)))なしでちょうどどこにでも押し込むべきだと考えてください。


CheckPointer()!=POINTER_INVALID は、チェックが必要ですか?

そして、なぜか...。ひとつにする bool Check(<template> &T) { retun CheckPointer(T)!=POINTER_INVALID } コンパイラはできるだけ単純にすることです。そして、さらに見栄えが良くなる。

より速くなりました。

int a[1000];
for (int i=0; i<ArraySize(a); i++)....
или
for (int i=ArraySize(a); i>=0; i--)....
дак вот разницы не должно быть вообще


まあ、あまり変わらなかったんですけどね。

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  {
  #define  ME CChartObjectRectangleX
public:
   void ME(){};      
   virtual int       Compare(const CObject *node,const int mode=0) const 
   {
   const ME*nc=dynamic_cast<const ME*>(node);
   return Check(nc)?mode==0?CompareDate(nc):CompareValue(nc):0;
   } 
   virtual int       CompareDate(const ME *node) const            {return (this.Time(1)-node.Time(1));}
   virtual int       CompareValue(const ME *node) const           {return ((this.Price(1)-node.Price(1))*10/Point()); }
 #undef  ME
};

これはすべてあなたのコードです。

 
Vladimir Simakov:

文字数が少ないだけで、皆さんと同じようです。そこで、好みの問題ですが、余分な変数を削除しました(もっとも、コンパイラは最適化の一環として削除しているはずです)。

私の「!node」チェックについて。CheckPointer(node)==POINTER_INVALID に置き換えなければならないが、これはオーバーヘッド、つまり関数呼び出しである。インライン化されていても、少なくともデリファレンスとステータスフラグのチェックはしているのです。ライブラリやコンクリートだけで、Compareメソッドを使用するプログラムを書いた場合、無効なポインタに注意するために、より良い!nodeとonコード。ポインタに注意するのが面倒な場合や、劣等生のためのライブラリである場合は、 CheckPointer(node)==POINTER_INVALID だけにしてください。

const指定を外すと、定数オブジェクトから これらのメソッドを呼び出すことができなくなります。

タブを開くのに時間がかかりました。


大学4年間はあまり知識の足しにはならなかったようです(説明はゴミ箱で遅れています)。

 

ベースクラスが入力パラメータへの参照を持たないため、constitution のない variant も正しく動作しますが、これは非常にスマートなスタイルとは言えません。

#include <ChartObjects\ChartObjectsShapes.mqh>

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject *node,int mode=0) 
   {
   ME*nc=dynamic_cast<ME*>(node);
   return Check(nc)?mode==0?CompareDate(nc):CompareValue(nc):0;
   } 
   virtual int       CompareDate(ME *node)             {return (this.Time(1)-node.Time(1));}
   virtual int       CompareValue(ME *node)            {return ((this.Price(1)-node.Price(1))*10/Point()); }
 #undef  ME
};
 

また、同コードのバリエーション。

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject *node,int mode=0)      {return Check(node)?mode==0?CompareDate(node):CompareValue(node):0;} 
   virtual int       CompareDate(CObject *node)             {return (  Time(1)-dynamic_cast<ME*>(node).Time(1));}
   virtual int       CompareValue(CObject *node)            {return ((Price(1)-dynamic_cast<ME*>(node).Price(1))*10/Point()); }
 #undef  ME
};


コンストラクターと同じものです。

template<typename T>
bool Check(T *a) {return CheckPointer(a)!=POINTER_INVALID;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define  ME CChartObjectRectangleX
public: 
   void ME(){};      
   virtual int       Compare(CObject const *node,int const mode=0)   const{return Check(node)?mode==0?CompareDate(node):CompareValue(node):0;} 
   virtual int       CompareDate(CObject const *node)                const{return (  Time(1)-dynamic_cast<const ME*>(node).Time(1));}
   virtual int       CompareValue(CObject const *node)               const{return ((Price(1)-dynamic_cast<const ME*>(node).Price(1))*10/Point()); }
 #undef  ME
};