2

最初にいくつかの背景:

UI インターフェイスを実装するレガシー コードに取り組んでいます。コードは、あらゆる種類のグラフィカル オブジェクトに派生する基本クラス (実際には構造体) WinBase を持つように構造化されています。

WinBase:
 - Button
 - DialogWin
 - (etc...)
 - EditWin

WinBase には、WinBase **children各オブジェクトのすべての子を監視するために使用されるメンバーがあります。これらの子は、実行時に標準の new[]/delete[] の方法で作成および破棄されます。

これらのオブジェクトのすべてのメソッド/関数は、WinBaseオブジェクトへのポインターを受け取っていることを前提としてdynamic_cast<>おり、適切なポインターが使用されていることを確認/検証するために使用されます。

その後のコード変更により、さらに 2 つのクラス/構造体 (ListBoxおよびTextBox) が追加されました。EditWinこれらは から派生し、 は から派生しWinBaseます。

WinBaseだから...私はそれがにキャストされていることListBoxへのポインタを持っていますTextBox。私が言ったようにdynamic_cast<>、コード全体で使用されていますが、このコンストラクターのような関数が呼び出されたときにこれがどれほど安全かはわかりません。

TextBox(WinBase *pw,(...));

(たとえば)から直接キャストしたり、その逆にキャストしたりするのはどのくらい安全WinBaseですか?ListBox

4

2 に答える 2

0

まず第一に、aがaを期待するメソッドに与えられたときに、なぜaWinBaseをaにキャストしたいのですか?そこでキャストが必要な場合は、設計を再考する必要があります。これは、がインターフェイス上でのみ動作することを期待するメソッドであるためです。ListBoxListBoxWinBaseWinBaseWinBase's

ListBoxはAであるため、(直接または間接的に)ListBoxから派生している場合に限り、いつでもaから(または参照)にキャストできます。WinBaseListBox*WinBase* WinBase

逆にキャストするのは安全ではありません。なぜなら、WinBase*あなたが得たものが実際にListBox*何か他のものであるかどうかがわからず、それが問題を引き起こすからです。dynamic_cast<>もちろん、それが本当にであるかどうかをテストするために使用できますListBox*が、動的キャストでは、デザインのレビューが必要になります。

特に、そのようなダウンキャストでは、コンストラクターで問題が発生します。必要なものが得られない場合、コードは何をする必要があるのでしょうか。例外をスローするのは、唯一の方法はそれほど良い考えではなく、(自分が何をしているのかを理解していない限り)最善の方法で回避するためです。

于 2012-07-13T11:51:44.073 に答える
0

したがって、boost::polymorphic_cast または boost::polymorphic_downcast http://www.boost.org/doc/libs/1_50_0/libs/conversion/cast.htmを使用してみてください。dynamic_cast が 0 を返すと、例外がスローされます。

于 2012-07-13T11:50:52.647 に答える