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

 

ヤァー...コンスト(((;゚Д゚)))ガクガクブルブル 人はなんてメチャクチャなんだ

const 指定のあるメソッドを理解するために

class CTest{
   int i;
public:
   CTest(int _i):i(_i){}
   int Get() const {return i;}
   int Get()   {return 2*i;}
};

void OnStart()
  {
   const CTest a(5);
   CTest b(8);
   Print(a.Get()); //5
   Print(b.Get()); //16
  }

今すぐ実行

   //int Get() const {return i;}

を実行し、その逆を実行する。

//   int Get()   {return 2*i;}

)))

 
Alexandr Andreev:

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


コンツェルンと一緒です。

そして、あなたは、入力が確実に

Compare(CObject const *node,int const mode=0)

♪ you'll always feed ♪

CChartObjectRectangleX*

を確認せずに書くのか?

return (  Time(1)-dynamic_cast<const ME*>(node).Time(1));

?

 
Alexandr Andreev:

ベースクラスが入力パラメータへの参照を持たないため、constitution を除いた variant も正しく動作しますが、このスタイルはあまり賢いものではありません。

そのようなことはありません。コンペアでは署名を変更することはできません。主にSBに搭載されているQuickSortメソッドを動作させるために必要です。

シグネチャを変更すると、仮想関数のオーバーライドではなく、オーバーロードとなり、ベースクラスCObjectの return 0のメソッドを呼び出していることになります。

もちろん、コンテナへのラッパー(装飾)で解決できるのですが、なぜこのような無駄な動きをするのか、さもなければSBを使わず、すべて一から書き直せということなのです。

 
Vladimir Simakov:

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

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

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

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

Vladimir, この場合、CheckPointerは冗長です。dynamic_castは、ポインタが壊れている場合も含め、キャストに失敗すると、NULLを返します。間違っていたら訂正してください。昔、テストしたところ、5秒で終わりました)。

CheckPointerの動作の仕組みは(低レベルの用語は流暢ではないので簡単に言うと)、ポインタからどんなオブジェクトか、動的か静的かを調べ、情報が得られない場合は、POINTER_INVALIDということになります。動的オブジェクトが削除された場合、これは、私は知らない他の状況、またはポインタにゴミをアップロードが、それはあなたが抜け穴を見つけることができない場合は、コンパイラをチェックする必要があります。

dynamic_cast も同様で、ポインタを必要な型にキャストできるかどうか、つまりこの型のポインタか子クラスのポインタかをチェックします。

ポインタが壊れている場合、dynamic_cast は何も検出できず、NULL を返します。

そのため、CheckPointerは使っていません。しかし、私は普段からこのチェックを危なくないようにどこでも使っています。結局、落ちていないソフトウェアのエラーを見つけるのは、少し簡単なようです)。

理論的には、GetRatingByAnyFormula() { m_rating01=Formula01(); return m_rating01;} のようなメソッドを用意することができるのです。

は、すぐにソートで使われないとかなり不便です。つまり、まずレーティングを数えてから、それによるソートを呼び出す必要があるのです。あるいは、すでに言われているように、自分で一からSBを書く)。

 
Aleksey Mavrin:

これはまずい。署名はCompareで変更することはできません。主にSBに含まれる通常のソート方法であるQuickSortを動作させるためのものです。

シグネチャを変更すると、仮想関数のオーバーライドではなく、オーバーロードとなり、ベースクラスCObjectの メソッドが呼び出され、return 0が返されることになります。

もちろん、コンテナへのラッパー(装飾)で解決できるのですが、なぜこれらの無駄な動きをするのか、SBを使わず、すべて一から書くのか?

最も正しい方法は、µlに書き込まないことです。

 
Aleksey Mavrin:

Vladimir, この場合、CheckPointerは冗長です。dynamic_castは、ポインタが壊れている場合も含め、キャストに失敗した場合はNULLを返します。間違っていたら訂正してください。昔、テストしたところ、5秒で終わりました)。

CheckPointerの動作の仕組みは(低レベルの用語は流暢ではないので簡単に言うと)、ポインタからどんなオブジェクトか、動的か静的かを調べ、情報が得られない場合はPOINTER_INVALIDを意味します。これは、動的なオブジェクトが削除された場合、私は他の状況を知らない、またはポインタにゴミをアップロードしたが、それはあなたが抜け穴を見つけることができない場合は、コンパイラをチェックする必要があります。

dynamic_cast も同様で、ポインタを必要な型にキャストできるかどうか、つまりこの型のポインタか子クラスのポインタかをチェックします。

ポインタが壊れている場合、dynamic_cast は何も検出できず、NULL を返します。

そのため、CheckPointerは使っていません。しかし、私は普段からこのチェックを危なくないようにどこでも使っています。結局、落ちていないソフトウェアのエラーを見つけるのは、少し簡単なようです)。

理論的には、GetRatingByAnyFormula() { m_rating01=Formula01(); return m_rating01;} のようなメソッドを用意することができるのです。

は、すぐにソートで使われないとかなり不便です。つまり、まずレーティングを数えてから、それによるソートを呼び出す必要があるのです。あるいは、すでに述べたように、自分で一からSBを書くことも可能です)。

  1. Compare-methodsはpublicに定義されているので、どんなに仕様で説明しても、どんな劣等生でも、有効でないディスクリプタをそこに押し込んでしまうということです。もちろん、図書館ではなく、自分だけのために使うのであれば、その必要はないでしょう。
  2. 私はCheckPointerが どのように動作するか知りません、そこまでの.しかし、いずれにしてもプロセッサのクロックとメモリアクセス(仮想メモリであることも容易に判明する)である。
  3. const 指定のあるメソッドについて。ライブラリを書く場合、オブジェクトが定数である必要があるかもしれないことを常に念頭に置かなければならないので、オブジェクトの状態を変更しないそれらのメソッドでは、それが望ましいように。今のところ、自分としては、あまり気にしていないんですけどね。
  4. 自分でシステムを書く、これは正しい判断でしょう。それはちょうど有料/労働比の興味深い見通しがまだ表示されていないため、独自のニーズのためにそう、終了することはありません)。
 
Vladimir Simakov:

私の!nodeチェックについて。CheckPointer(node)==POINTER_INVALID で置き換えるべきですが、これはオーバーヘッド、関数呼び出しです。

問題はオーバーヘッドではなく、壊れたポインタがプログラムのロジックを変えてしまうことにある。 つまり、問題を検出する代わりに、さらに深く埋めてしまうことになるのだ。

CheckPointerは デバッグ目的、または弱ポインタの実装としてのみ使用する必要があります。

 
Vladimir Simakov:
  1. Compare-methodsはpublicに定義されているので、どんな劣等生でも、仕様書でいくら言っても、そこに無効な記述子を突っ込んできます(物事は正式名称で呼びましょう)。もちろん、図書館ではなく、自分だけのために使うのであれば、その必要はないでしょう。
  2. 私はCheckPointerがどのように動作するか知りません、そこまでの.しかし、いずれにしてもプロセッサのクロックとメモリアクセス(仮想メモリであることも容易に判明する)である。
  3. const 指定のあるメソッドについて。あなたがライブラリを記述する場合は、常にオブジェクトが定数を必要とするかもしれないことを心に留めておく必要がありますので、それは望ましいとして、オブジェクトの状態を変更しないそれらのメソッドで、。今のところ、自分としては、あまり気にしていないんですけどね。
  4. 自分でシステムを書く、これは正しい判断でしょう。それはちょうど有料/労働比の興味深い見通しがまだ表示されていない、したがって、唯一の自分のニーズのためにそう、持って来られることはありません)。

1.しかし、私が言いたかったのは、CheckPointerは(たとえ劣勢であっても)必要ない、ということです。 dynamic_castは無効でないポインタを返してはならず、NULLのみを返 します。

2.面白いのですが、動的オブジェクトを殺すか、作業中に直接メモリを「汚す」以外に、無効でないポインタを得ることができる例がすぐに思いつきません。

まだ、そういう方法もあると思いますが、いずれもコンパイラのチェックを回避するという面を持つことがほとんどでしょう。

3,4 同意する。

追伸

1-stを勘違いしていたのでしょう。テストはその逆をいっている。単なる印象に過ぎないのでしょう)。

void OnStart()
  {
      CChartObjectRectangle *base = new CChartObjectRectangle();
      CChartObjectRectangleX *rect = new CChartObjectRectangleX();
       CChartObjectRectangle * dbase  ;
      const CChartObjectRectangleX *drect  ;
      Print("dbase= ",dbase, " NULL ? ",dbase==NULL," check? ",!dbase, " broken? ", EnumToString( CheckPointer(dbase) ));
      dbase=dynamic_cast< CChartObjectRectangle *>  (base);
      Print("dbase= ",dbase, " NULL ? ",dbase==NULL, " check? ",!dbase," broken? ", EnumToString( CheckPointer(dbase) ));
      delete base;
      Print("dbase= ",dbase, " NULL ? ",dbase==NULL," check? ",!dbase, " broken? ", EnumToString( CheckPointer(dbase) ));
      dbase=dynamic_cast< CChartObjectRectangle *>  (base);   
      Print("dbase= ",dbase, " NULL ? ",dbase==NULL," check? ",!dbase, " broken? ", EnumToString( CheckPointer(dbase) ));   
  }
 
publicクラスのセクションで静的配列を 宣言し、コンストラクタで初期化することは可能でしょうか?(以下同様) (あるいは要素ごとのみ?)
 bool Mass[5] = { false, true, false, true, true };
 
Pavel Verveyko:
publicクラスのセクションで静的配列を 宣言し、コンストラクタで初期化することは可能ですか?(以下同様) (あるいは要素単位のみ?)

ローカル配列を初期化し、適切な配列フィールドにArrayCopyを実行することができます。

class A{
public:
   bool Mass[5];
   A(){
       bool mass_init[5] = { false, true, false, true, true };
       ArrayCopy(Mass, mass_init);
   }
};