2013年7月13日 星期六

取得類別名稱

大部份知名的 Design Pattern 實作技巧都是建立在抽像類別上面,因為最近在 C++ 上綀習一些 Design Pattern 時,因為都是操作基底的抽像類別,所以產生了想要知道目前物件到底型態是什麼的需求。

翻了一下發現在 C++ 裡面有一個叫 typeid 關鍵字可以使用,它會傳回一個 type_info 類別,即可從這個類別拿到物件的 type 名稱,使用方法如下

// 假設有 AAA 類別與繼承自 AAA 的 BBB 類別
class AAA
{
};

class BBB : public AAA
{
};

int nObj;
CString strIntType = CString(typeid(nObj).name()); // int
AAA aObj;
CString strAType = CString(typeid(aObj).name()); // class AAA
BBB bObj;
CString strBType = CString(typeid(bObj).name()); // class BBB
AAA* pAObj = new AAA;
CString strPAType = CString(typeid(pAObj).name()); // class AAA *
BBB* pBObj = new BBB;
CString strPBType = CString(typeid(pBObj).name()); // class BBB *

但目前我遇到一個狀況,未經過向下轉型的物件是拿不到正確名稱的,只能拿到上層類別的名稱,例如

AAA* pABObj = new BBB;
CString strPABType = CString(typeid(pABObj).name()); // class AAA *

偏偏這種寫法在很多知名 Design Pattern 都是必要的,我目前只能先透過增加 GetName() Function 來幫助追縱物件型態嘍。

class AAA
{
public:
virtual CString GetName() { return _T("AAA"); };
};

class BBB : public AAA
{
public:
virtual CString GetName() { return _T("BBB"); };
};

AAA* pABObj = new BBB;
CString strPABType = CString(typeid(pABObj).name()); // class AAA *
CString strPABName = pABObj->GetName(); // BBB


2 則留言:

  1. Typeid 本來大概就是不可信吧。而且還會因為編譯器的不同而不同。這也是多數c++都提供自己處理rtti的方式。不過基本原理就跟你的作法一樣。。。

    回覆刪除