記事"MQL5でのオブジェクトポインターの使用"についてのディスカッション - ページ 4

 
tol64:
セキュリティホールは見つかったか?)
直接キャストするのは邪道だ。プラスにはこの目的のために特別にdynamic_castがあるが、ここでは完全に正しくキャストすることはできないし、暗黙の深刻なエラーの原因になる可能性がある。また、深刻さという点では、安全でないポインタや参照よりもはるかに優れているとは言えません。
 
denkir:

ポリモーフィズムを 使った方がいいのでは?

おおよそそうです:

それは、継承クラスCChartObjectRectLabelCChartObjectButtonCChartObjectEditには、アクセスする必要のある独自のメソッドがあるということです。そして、標準ライブラリの基底クラスCChartObjectは 、同じ仮想メソッドを持っていません。

 

上記の私の例では...

メソッドにアクセス できますか?


...それは次のようになります:

//--- objects[0].// CChartObjectEditクラスのメソッドにアクセスするには?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- オブジェクト[1]。// CChartObjectButtonクラスのメソッドにアクセスするには?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objects[2].// CChartObjectRectLabel クラスのメソッドにアクセスするには?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
そうだね。このように直接キャストするのは正統派ではありません。プラスにはこの目的のために特別にdynamic_castが あるが、ここでは完全に正しくキャストすることはできないし、暗黙の深刻なエラーの原因になる可能性がある。また、深刻なことに、安全でないポインタや参照よりもはるかに優れているわけではありません。

このフォーラムで質問する前に、ネットでC++にはdynamic_cast 演算子(動的 データ識別のメカニズム)があることを知りました。

今、上のリンクを見ています:

// 動的なデータ型識別の仕組みは、ポリモーフィックなデータ型に対してのみ有効である。 
// クラス(すなわち、少なくとも1つの仮想メンバ関数を含むクラス)

これは必須条件なのですね?また、基底クラスに仮想メソッドがない場合、dynamic_castは 機能しないのでしょうか?

追伸 >> dynamic_castについては こちら(MSDN)を読んでいます。

 
TheXpert:
くそ、そのあとで言語安全性について語るのか?

あなたはおそらく、C/C++のように何でも自由にキャストできると考えているのだろう。

そうではないし、安全性には何の問題もない。

 
Renat:

おそらく、C/C++のように何にでも自由にキャストできると思っているだろう。

そうではないし、安全性に問題はない。

私は偶然このエラーに遭遇した。)

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

安全性に問題はありません。

いいえ、通常コンパイル時にdynamic_castチェックを行うことはできません。
 
TheXpert:
いいえ、コンパイル時にdynamic_castを正しくチェックすることはできません。

上のコメントは、rantimeでの キャスト・チェックの結果を示しています。

これは非常に厳格で、RTTIメカニズムで動作し、ゴーストの場合に誰が誰であるかが 正確にわかるからだ。

 
Renat:

上のコメントは、rantimeでの キャスティング・チェックの結果を示している。

おっと...。混乱した。コンパイラかと思った。では撤回します。
 
チュートリアルのおかげで、ポリモーフィズムを理解することができました。ありがとうございました。