の 3 番目のパラメーターOnUpdate
は へのポインターCObject
です。ポインターは、独自の を実装するビュー クラスでダウンキャストする必要がありますOnUpdate
。キャストが成功したかどうかを確認する最良の方法は何ですか? CObject::IsKindOf
またはdynamic_cast
? _ MFC プロジェクトで RTTI を使用しても問題ありませんか?
3 に答える
ウィザードを使用してビューを作成した場合、ビュー クラスのヘッダー ファイルに DECLARE_DYNCREATE が配置されます。手動で作成した場合は、ビューのヘッダー ファイルのクラス定義に DECLARE_DYNCREATE があることを確認します (または、少なくとも DECLARE_DYNAMIC または DECLARE_SERIAL--DECLARE_SERIAL は通常、ビュー クラスでは過剰です)。
次に、ダウンキャストする場合は、DYNAMIC_DOWNCAST マクロを使用し、戻り時に NULL でないことをテストします。
CView* pView = DYNAMIC_DOWNCAST(CView, pObject); // 1 つの使用法です
移植性がないため、MFC マクロを使用しないようにというアドバイスに耳を傾けないでください... CView 派生クラスを作成している場合、Wind/U のようなツールキットを使用しない限り、それはすでに移植性がありません。DYNAMIC_DOWNCAST は携帯性も。
CObject::IsKindOf()
クラスがDECLARE_DYNAMIC
、 DECLARE_DYNCREATE
、またはDECLARE_SERIAL
(でCView
宣言されている) で宣言されている場合にのみ機能しますが、RTTI サポートは必要ありません。
dynamic_cast
RTTI サポートで動作しますが、オーバーヘッドが含まれており、実行可能ファイルのサイズがわずかに大きくなります。これを確認してください..
仕事で dynamic_cast を使用していますが、問題はありません。キャストの成功を確認するのは非常に簡単です: CDerivedView* pView = dynamic_cast(pViewObj); if (! pView) { ASSERT(0); 戻る; }
また、MFC 自体のように移植性がないため、MFC のマクロは使用しないようにしています。良いプログラムは、それが使ってきたライブラリにほとんど依存してはいけないと思います。