<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 15.5 提供運行期類型信息 提供運行期類型信息 和大多數編程框架一樣,wxWidgets提供了比標準C++更多的運行期類型信息.這對于在運行期依對象類型決定行為,或者在上節提到的錯誤報告中都是很有用處的.并且它還允許你通過對象名來創建一個那種類型的變量.需要注意的是:只有派生自wxObject的類才可以使用wxWidgets的RTTI (運行期類型信息). 如果你不需要動態創建功能,你需要在類聲明中使用DECLARE_CLASS(class)宏,而在類實現中使用 IMPLEMENT_CLASS(class, baseClass)宏,反之,則需要使用DECLARE_DYNAMIC_CLASS(class)宏和IMPLEMENT_DYNAMIC_ CLASS(class, baseClass)宏.另外,如果你希望使用動態創建功能,你還需要保證你的類擁有一個默認的構造函數,否則在編譯那些用來動態產生某個對象的代碼時, 編譯器可能會報錯. 下面是定義和動態創建一個對象的例子: ``` class MyRecord: public wxObject { DECLARE_DYNAMIC_CLASS(MyRecord) public: MyRecord() {} MyRecord(const wxString& name) { m_name = name; } void SetName(const wxString& name) { m_name = name; } const wxString& GetName() const { return m_name; } private: wxString m_name; }; IMPLEMENT_DYNAMIC_CLASS(MyRecord, wxObject) MyRecord* CreateMyRecord(const wxString& name) { MyRecord* rec = wxDynamicCast(wxCreateDynamicObject(wxT("MyRecord")), MyRecord); if (rec) rec->SetName(name); return rec; } ``` 當CreateMyRecord被調用的時候,wxCreateDynamicObject負責創建所需的對象,而 wxDynamicCast則負責進行類型檢查,如果檢查失敗則返回NULL.也許你覺得這個代碼看上去并沒有什么實際的用處,但是在從文件加載一堆不同類型的對象的時候,這是非常有用的.對象的數據和它的名稱被一起存放在文件中,通過名字創建一個對象的實例,然后再使用這個實例加載相應的數據. 下面我們來介紹以下運行期類型信息的一起其它相關宏: CLASSINFO(class)返回一個指向wxClassInfo類型的指針.你可以使用wxObject::IsKindOf函數來判斷某個對象是否是對應的類型: ``` if (obj->IsKindOf(CLASSINFO(MyRecord))) { ... } ``` 使用DECLARE_ABSTRACT_CLASS(class)和IMPLEMENT_ABSTRACT_CLASS(class, baseClass)來定義虛類. 使用DECLARE_CLASS2(class)和IMPLEMENT_CLASS2(class, baseClass1, baseClass2)來定義有兩個父類的類. 使用DECLARE_APP(class)和IMPLEMENT_APP(class)來使得wxWidgets知道整個應用程序類的運行期類型信息. wxConstCast(ptr, class)用來代替const_cast&lt;class *&gt;(ptr),如果編譯器不支持const_cast,則使用舊的C語言的類型強制轉換. wxDynamicCastThis(class)相當于wxDynamicCast(this, class), 但是后者在某些編譯器上會導致永真比較告警,因為它將測試是否指針為空,而this指針永遠不可能為空,前者可以避免這個告警. wxStaticCast(ptr, class)在調試模式將檢查強制類型轉換的有效性(如果wxDynamicCast(ptr, class) == NULL將引發斷言錯誤)然后返回static_cast&lt;class*&gt;(ptr)的等同結果. wx_const_cast(T, x)在編譯器支持的情況下等同于const_cast&lt;T&gt;(x),否則等同于(T)x(C語言類型強制轉換語法).和 wxConstCast不同的是,它強制轉換的是T本身而不是指向T的指針,而且參數的順序也和標準強制轉換的順序相同. wx_reinterpret_cast(T, x)則相當于reinterpret_cast&lt;T&gt;(x),如果編譯器不支持則等同于(T)x. wx_static_cast(T, x)等同于static_cast&lt;T&gt;(x),如果編譯器不支持則等同于(T)x. 和wxStaticCast不同的是,它不做類型檢查,并且采用和標準的靜態轉換相同的參數順序,而且轉換的也是T而不是指向T的指針.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看