wxWidgets は現在の標準 C++ RTTI よりも以前から,独自の RTTI (ランタイム型識別: Run-Time Type Identification) システムを使っており, 現在でも以前のバージョンとの互換性のために残っています.また,独自 RTTI を残しているのは,標準 RTTI がサポートしていない (クラス名前から クラスを作成するといった) 機能を持っているからでもあります.
標準 C++ RTTI は全く問題なくユーザコードで利用でき,一般的には, 何らかの wxWidgets のクラスを修正したり追加したいと思わない限り, この節で説明する関数やマクロを使う必要はありません.
See also
クラスに関連付けられた wxClassInfo オブジェクトへのポインタを 返します.
Include files
<wx/object.h>
クラス宣言の中で使い,そのクラスがクラス階層中で既知ではあるが, クラスのオブジェクトは動的に生成できないようなクラスであると宣言します. DECLARE_CLASS と同じです.
例:
class wxCommand: public wxObject { DECLARE_ABSTRACT_CLASS(wxCommand) private: ... public: ... };
Include files
<wx/object.h>
ヘッダ内で使い,IMPLEMENT_APP で実装された wxGetApp 関数の前方宣言を生成します. className& wxGetApp(void) の宣言を生成します.
例:
DECLARE_APP(MyApp)
Include files
<wx/app.h>
クラス宣言の中で使い, そのクラスがクラス階層中で既知ではあるが,クラスのオブジェクトは 動的に生成できないようなクラスであると宣言します. DECLARE_ABSTRACT_CLASS と同じです.
Include files
<wx/object.h>
クラス宣言の中で使い, そのクラスのオブジェクトはランタイム型情報から動的に生成されるべきで あると宣言します.
例:
class wxFrame: public wxWindow { DECLARE_DYNAMIC_CLASS(wxFrame) private: const wxString& frameTitle; public: ... };
Include files
<wx/object.h>
C++ の実装ファイル中で使い,ランタイム型情報を持つクラスの宣言を 完結させます. IMPLEMENT_CLASS と同じです.
Example:
IMPLEMENT_ABSTRACT_CLASS(wxCommand, wxObject) wxCommand::wxCommand(void) { ... }
Include files
<wx/object.h>
C++ の実装ファイル中で使い,ランタイム型情報と二つの基底クラスを持つ クラスの宣言を完結させます. IMPLEMENT_CLASS2 と同じです.
Include files
<wx/object.h>
アプリケーションクラスの実装を行っているファイル中で使い, アプリケーションの動的構築を行うためにwxWidgets にアプリケーション クラスを認識させます.古い形式:
MyApp myApp;
の代わりに以下の新しい形式:
IMPLEMENT_APP(MyApp)
を使ってください.
DECLARE_APP も参照してください.
Include files
<wx/app.h>
C++ の実装ファイル中で使い,ランタイム型情報を持つクラスの宣言を 完結させます. IMPLEMENT_ABSTRACT_CLASS と同じです.
Include files
<wx/object.h>
C++ の実装ファイル中で使い,ランタイム型情報と二つの基底クラスを持つ クラスの宣言を完結させます. IMPLEMENT_ABSTRACT_CLASS2 と同じです.
Include files
<wx/object.h>
C++ の実装ファイル中で使い,ランタイム型情報を持ち,インスタンスを 動的に生成できるようなクラスの宣言を完結させます.
例:
IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) wxFrame::wxFrame(void) { ... }
Include files
<wx/object.h>
C++ の実装ファイル中で使い,ランタイム型情報を持ち,インスタンスを 動的に生成できるようなクラスの宣言を完結させます. 二つの基底クラスを持つようなクラスにはこちらを使ってください.
Include files
<wx/object.h>
このマクロは,コンパイラが const_cast をサポートしている場合には const_cast<classname *>(ptr) に,サポートしていない場合には 古い C スタイルのキャストに展開されます.
See also
wx_const_cast
wxDynamicCast
wxStaticCast
指定したクラスが DECLARE ... と IMPLEMENT ... マクロを使って動的クラス システムに登録済みである場合,そのクラスのオブジェクトを生成して返します.
デバッグモードでは,ファイル名と行番号を伴うよう再定義された new 演算子として定義されています.定義は以下のようになります:
#define WXDEBUG_NEW new(__FILE__,__LINE__)
非デバッグモードでは,通常の new 演算子として定義されています.
Include files
<wx/object.h>
ポインタ ptr が classname * 型を指す場合 (チェックは実行時に 行われます) classname* 型へのキャストを返します.そうでない場合には NULL を返します.wxObject::IsKindOf() 関数は撤廃されており, このマクロを使うよう勧めます.
引数 ptr は NULL でもよく,その場合には NULL を 返します.
例:
wxWindow *win = wxWindow::FindFocus(); wxTextCtrl *text = wxDynamicCast(win, wxTextCtrl); if ( text ) { // a text control has the focus... } else { // no window has the focus or it is not a text control }
See also
RTTI overview
wxDynamicCastThis
wxConstCast
wxStaticCast
このマクロは wxDynamicCast(this, classname) と同じです. wxDynamicCast(this, classname) はコンパイラによっては見当違いの コンパイル時警告を引き起こすため,このマクロを使って回避してください.
See also
このマクロは,デバッグモードにおいてキャストが有効化チェック (wxDynamicCast(ptr, classname) == NULL の場合にはアサーション 失敗になります) し,static_cast<classname *>(ptr) と等価な コードの実行結果を返します.
See also
wx_static_cast
wxDynamicCast
wxConstCast
コンパイラが const キャストをサポートする場合には const_cast<T>(x) と同じになり,古いコンパイラでは (T)x になります. wxConstCast と違い,T * ではなく T へのキャストを行い, 引数の順番は標準のキャストと同じようになります.
See also
wx_reinterpret_cast,
wx_static_cast
コンパイラが再解釈キャスト (reinterpret cast) をサポートする場合には reinterpret_cast<T>(x) に,古いコンパイラの場合には (T)x になります.
See also
コンパイラが静的キャスト (static cast) をサポートする場合には static_cast<T>(x) に,古いコンパイラの場合には (T)x になります.wxStaticCast と違い, チェックを行いません.また,マクロの引数の意味は標準の静的キャスト と全く同じです.すなわち, T は完全な型名で,アスタリスクを 追加することはありません.
See also
wx_const_cast,
wx_reinterpret_cast
ymasuda 平成17年11月19日