成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Symbian開發(fā)總結(jié)--RTTI的實現(xiàn)及原理說明

移動開發(fā)
本文和大家學(xué)習(xí)一下Symbian開發(fā)總結(jié)RTTI的實現(xiàn)及原理說明,RTTI(運行時類型信息)是被現(xiàn)代高級編程語言所普遍支持的特性之一。

本文和大家重點學(xué)習(xí)一下Symbian開發(fā)總結(jié)--RTTI的實現(xiàn)及原理說明。RTTI(運行時類型信息)是被現(xiàn)代高級編程語言所普遍支持的特性之一,然而SymbianOSC++并不支持這個特性,這導(dǎo)致由Win32、JAVA轉(zhuǎn)向Symbian的開發(fā)人員或者代碼的移植都帶來很大的不便,本文將解決這個問題。

Symbian開發(fā)總結(jié)--RTTI的實現(xiàn)及原理說明

一、前言

  RTTI(運行時類型信息)是被現(xiàn)代高級編程語言所普遍支持的特性之一,如C#中的“aisA”、JAVA中的“ainstanceofA”都屬于RTTI的范疇。然而SymbianOSC++并不支持這個特性,這導(dǎo)致由Win32、JAVA轉(zhuǎn)向Symbian的開發(fā)人員或者代碼的移植都帶來很大的不便,本文將解決這個問題。
  
二、什么是RTTI

  Symbian開發(fā)中RTTI指的是“運行時類型識別(Run-TimeTypeIdentification)”或者“運行時類型信息(Run-TimeTypeInformation)”,程序能夠使用基類的指針或引用來檢查這些指針或引用所指的對象的實際派生類型。

  隨著應(yīng)用場合之不同﹐所需支持的RTTI范圍也不同。最單純的RTTI包括:

  類識別(classidentification)──包括類名稱或ID。

  繼承關(guān)系(inheritancerelationship)──支持執(zhí)行時期的“往下變換類型”(downwardcasting),亦即動態(tài)變換類型(dynamiccasting)。
  
三、Symbian開發(fā)中的RTTI

  由于Symbian系統(tǒng)以及它運行的硬件環(huán)境的限制,造成Symbian系統(tǒng)編程不能完全像一般C++程序設(shè)計隨心所欲,SymbianOSC++并不提供對RTTI的支持。所以,標(biāo)準(zhǔn)C++中的dynamic_cast<>、typeid()及type_info都是不被支持的。
  
四、移植MFC代碼實現(xiàn)RTTI

  Symbian開發(fā)中VC++編譯器從4.0版才開始支持RTTI,但MFC4.x并未使用編譯器的能力完成其對RTTI的支持。MFC有自己一套沿用已久的辦法(從1.0版就開始了)。在此,我們借用MFC中實現(xiàn)RTTI的代碼,來完成對SymbianOSC++RTTI的支持。

  關(guān)于MFC中RTTI的實現(xiàn)原理,侯捷的《深入淺出MFC》里已經(jīng)有詳細的闡述,基本原理是使用幾個特殊的宏手動的在編譯期間確定一個對象繼承關(guān)系鏈表,在此不再說明具體原理。

我們移植的是VC++9.0中MFC實現(xiàn)RTTI的代碼,不使用侯捷在《深入淺出MFC》中所提供的模擬代碼。因為侯捷的代碼中存在非常多的“可寫的靜態(tài)數(shù)據(jù)”,將不能在SymbianDLL或者2nd版的APP中使用。然而,VC++9.0中的MFC代碼沒有存在以上問題,所以可以再任何Symbian代碼中使用。

  壓縮包內(nèi)包含兩個文件:Rtti.h、Rtti.cpp。將這兩個文件加入工程后,著手設(shè)計實現(xiàn)RTTI的類:

  1、類的聲明:

  Rtti.h頭文件中的CRttiBase是擁有RTTI特性的基礎(chǔ)類,此類相當(dāng)于MFC中的CObject,它繼承自CBase,所有要實現(xiàn)RTTI特性的類都要從此類派生,并且在聲明加入一個特殊的宏:
 

  1. class CMyClass : public CRttiBase    
  2.    {    
  3.  DECLARE_DYNAMIC(CMyClass)    
  4.    ...    
  5.   };    
  6.  

 

 

  注意:宏DECLARE_DYNAMIC中的第一個參數(shù)為當(dāng)前類的類名:CMyClass。

  聲明第二個類繼承自CMyClass,同樣的,要加上DECLARE_DYNAMIC宏:
 

  1. 1 class CMyClass1 : public CMyClass  
  2. 2   {  
  3. 3 DECLARE_DYNAMIC(CMyClass1)  
  4. 4   ...  
  5. 5   };  

 

  注意:實現(xiàn)RTTI的子類繼承自父類,而父類必須繼承自CRttiBase。

  2、類的實現(xiàn)

  在CMyClass和CMyClass1的實現(xiàn)源文件分別加入以下兩行代碼:
 

  1. 1 IMPLEMENT_DYNAMIC(CMyClass, CRttiBase);  
  2. 2 IMPLEMENT_DYNAMIC(CMyClass1, CMyClass);  

 

宏IMPLEMENT_DYNAMIC中的第一個參數(shù)為當(dāng)前子類型,第二個參數(shù)為直接父類型,如:CMyClass的直接父類為CRttiBase,CMyClass1的直接父類為CMyClass。

  3、使用RTTI特性

  通過以上簡單兩個步驟,我們就能使用RTTI特性了,完整代碼:
 

  1. 1 class CMyClass : CRttiBase  
  2.  2   {  
  3.  3 DECLARE_DYNAMIC(CMyClass)  
  4.  4   };  
  5.  5   
  6.  6 class CMyClass1 : CMyClass  
  7.  7   {  
  8.  8 DECLARE_DYNAMIC(CMyClass1)  
  9.  9   };  
  10. 10   
  11. 11 class CMyClass2 : CRttiBase  
  12. 12   {  
  13. 13 DECLARE_DYNAMIC(CMyClass2)  
  14. 14   };  
  15. 15   
  16. 16 IMPLEMENT_DYNAMIC(CMyClass, CRttiBase);  
  17. 17 IMPLEMENT_DYNAMIC(CMyClass1, CMyClass);  
  18. 18 IMPLEMENT_DYNAMIC(CMyClass2, CRttiBase);  
  19. 19   
  20. 20 LOCAL_C void MainL()  
  21. 21   {  
  22. 22   CMyClass1* mc1 = new (ELeave) CMyClass1;  
  23. 23   TBool a = mc1->IsKindOf(RUNTIME_CLASS(CMyClass));  
  24. 24   TBool b = mc1->IsKindOf(RUNTIME_CLASS(CRttiBase));  
  25. 25   TBool c = mc1->IsKindOf(RUNTIME_CLASS(CMyClass2));  
  26. 26   }  

 

  從代碼中可以看出CMyClass1的父類為CMyClass,CMyClass的父類為RTTI基類CRttiBase,而CMyClass2的基類也為CRttiBase,CMyClass1和CMyClass2沒有繼承關(guān)系。

  所以,代碼第23至25行,abc的值依次為true、true、false。

  CRttiBase::IsKindOf方法類似于C#中的“is”關(guān)鍵字、JAVA中的“instanceof”關(guān)鍵字,傳入的是某個類的運行時信息,而宏“RUNTIME_CLASS”獲取的是某個類的運行時信息“CRuntimeClass”。

   4、運行時信息

  “運行時信息”結(jié)構(gòu)體CRuntimeClass在創(chuàng)建時將類的信息保存以便程序運行時查閱,其中包括類名、類大小、父類信息等。這些信息在宏IMPLEMENT_DYNAMIC內(nèi)部,在程序編譯的時候就已經(jīng)確定:
 

  1. 1 struct CRuntimeClass  
  2.  2   {  
  3.  3   const char* iClassName;  
  4.  4   TInt iObjectSize;  
  5.  5   TUint iSchema;   
  6.  6   CRttiBase* (*iCreateObjectProc)();   
  7.  7   CRuntimeClass* iBaseClass;  
  8.  8   CRttiBase* CreateObject();  
  9.  9   TBool IsDerivedFrom(const CRuntimeClass* aBaseClass) const;  
  10. 10   CRuntimeClass* iNextClass;  
  11. 11   };  

 

  注:CRuntimeClass可以理解為C#中的System.Type類型。

  5、Symbian開發(fā)中獲取類和對象的運行時信息

  獲取類的運行時信息使用宏RUNTIME_CLASS,如:


CRuntimeClass* classType = RUNTIME_CLASS(CMyClass);

  注:以上代碼可以理解為C#中的“TypeclassType=typeof(CTestClass);”方法取類的類型信息。

  獲取對象的運行時信息使用CRttiBase::GetRuntimeClass()方法,如:


  CMyClass1* mc1 = new (ELeave) CMyClass1;
  CRuntimeClass* rc = mc1->GetRuntimeClass();

注:以上代碼可以理解為C#中的“TypeclassType=theClass.GetType();”方法取對象的類型信息。

  兩種方法均返回CRuntimeClass*。

  6、通過運行時信息動態(tài)創(chuàng)建對象

  大家可能會注意到CRuntimeClass有一個方法叫“CreateObject”,此方法能夠通過運行時信息動態(tài)的創(chuàng)建對象。這在某些實現(xiàn)比較復(fù)雜的功能往往是很有必要的。如:

  有一個工廠,能夠生產(chǎn)不同的零件,而能夠生產(chǎn)的零件的類型是多種多樣的。

  在沒有實現(xiàn)RTTI之前,我們可能會在工廠方法里寫一個很大的case語句,針對不同的零件類型進行判斷從而調(diào)用不同類的構(gòu)造函數(shù)。

  而實現(xiàn)了RTTI后,我們只需要保持一個零件類型和CRuntimeClass之間的哈希表,在工廠方法中向哈希表傳入零件類型,找到CRuntimeClass后調(diào)用CRuntimeClass::CreateObject()方法即可。

  要實現(xiàn)動態(tài)創(chuàng)建對象,必須把函數(shù)聲明中的DECLARE_DYNAMIC改為DECLARE_DYNCREATE,把IMPLEMENT_DYNAMIC改為IMPLEMENT_DYNCREATE即可。如:
 

  1. 1 class CMyClass : CRttiBase  
  2. 2   {  
  3. 3 DECLARE_DYNCREATE(CMyClass)  
  4. 4   };  
  5. 5   
  6. 6 IMPLEMENT_DYNCREATE(CMyClass, CRttiBase);  

 

  這樣,CMyClass的類型信息就能夠提供動態(tài)創(chuàng)建對象的功能了。
  
五、注意事項

  CRttiBase是實現(xiàn)了對RTTI特性支持的父類,系統(tǒng)本身沒有提供對RTTI的支持。所以,要實現(xiàn)RTTI的類必須直接或間接的繼承自CRttiBase,這通常會對我們的設(shè)計造成很大的影響。如:如果一個類為活動對象,繼承自CActive,它又要實現(xiàn)RTTI特性,顯然以下聲明是錯誤的,因為CActive與CRttiBase都繼承自CBase:

class CMyActiveObject: public CActive, public CRttiBase {...}

  在此有兩種方法解決:

  采用Wrapper模式,封裝CActive并導(dǎo)出接口

  通過修改rtti.h,使CRttiBase不繼承自CBase,每個基于RTTI的類都手動的指定基類CBase或其它,然后使用C++多重繼承的支持實現(xiàn)類的設(shè)計。
  
六、參考文獻

  深入淺出MFC,侯捷

  如何在運行時確定對象類型(RTTI)

  SymbianOSC++高效編程

 

責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2020-10-23 18:46:58

C++程序類別

2010-07-12 09:34:59

Symbian開發(fā)

2010-07-02 09:54:32

Symbian開發(fā)

2010-07-22 09:25:21

Symbian開發(fā)

2010-02-01 14:33:05

C++實現(xiàn)RTTI

2010-04-22 11:42:44

Symbian開發(fā)

2011-06-16 16:21:06

Qt Symbian FAQ

2010-01-21 15:07:31

C++開發(fā)

2023-10-18 08:12:34

Spring自動配置

2022-03-17 08:55:43

本地線程變量共享全局變量

2025-05-27 01:00:00

2010-07-12 09:43:38

Symbian開發(fā)

2010-04-12 11:35:38

Symbian開發(fā)

2010-05-22 10:38:15

Symbian開發(fā)

2015-03-10 13:55:31

JavaScript預(yù)解析原理及實現(xiàn)

2010-09-07 17:27:54

Carbide.c++Symbian移動開發(fā)

2011-06-16 15:17:16

2010-06-22 10:01:40

Symbian開發(fā)

2019-03-25 15:14:19

Flutter馬蜂窩開發(fā)

2012-05-24 09:38:08

Symbian
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩毛片免费看 | 三级在线视频 | 久久乐国产精品 | 国产精品一区二区三区久久 | 国产成人综合一区二区三区 | 国产一级在线 | 午夜精品久久久久久久久久久久久 | 亚洲天堂中文字幕 | 国产精品美女久久久久久免费 | 成人免费在线网 | 亚洲三区在线观看 | 一级毛片色一级 | 国产激情一区二区三区 | 久久国产精品精品国产色婷婷 | 欧美理论 | 在线观看中文字幕视频 | av一级| 天堂一区在线观看 | 欧美a级成人淫片免费看 | 日本激情视频中文字幕 | 国产日韩一区 | 男女免费观看在线爽爽爽视频 | 精品久久影院 | 国产毛片毛片 | 国产一级片免费视频 | 国产亚洲精品成人av久久ww | 91在线免费视频 | 成人欧美一区二区三区黑人孕妇 | 国产高清精品一区二区三区 | 亚洲一区二区三区在线 | 国产精品自拍一区 | 在线三级网址 | 亚洲精品一区av在线播放 | 国产在线精品一区二区 | 国产精品中文字幕一区二区三区 | 国产99精品 | 一区二区三区免费 | av中文在线观看 | 一本色道精品久久一区二区三区 | 在线观看成人免费视频 | 日韩免费一区 |