2013-05-28 52 views
1

所以我想測試我的物體是魔藥還是武器。我如何用typeid(即任何其他方法)做到這一點?如何使用typeid檢查您的對象是哪個派生類?

然後我想基於這個條件實例化一個對象。我不能只說T temp,因爲它會實例化一個抽象基類(即我的Item類中有一個純虛函數)。

template <typename T> 
void List<T>::Load(std::ifstream & file) 
{ 
//Read the number of elements 
file.read(reinterpret_cast<char *>(&mNumberOfNodes), sizeof(int)); 

//Insert nodes into list 

//If object is a potion 
    //T * temp = new Potion; 

//If object is a weapon 
    //T * temp = new Weapon; 

for(int i = 0; i < mNumberOfNodes; i++) 
{ 
    temp->Load(file); 
    this->PushFront(&temp); 
    mNumberOfNodes--; 
    mNumberOfNodes--; 
} 
} 
+1

你看過[工廠模式](http://www.oodesign.com/factory-pattern.html)嗎? –

+0

哈!我希望我有。明年我會採用軟件設計模式,但我會盡力去理解這篇文章。 ( – MrPickle5

+1

dynamic_cast is one way。 –

回答

1

我不推薦使用typeid,以確定你打算使用它們的方式對象類型。原因是存儲在類型信息中的值可能會在構建之間發生變化。如果發生這種情況,每個在更改程序之前創建的數據文件都將不再起作用。

相反,您應該自己定義一組值,並將它們與程序中的各種對象類型相關聯。最簡單的方法是在加載文件時使用枚舉和開關/大小寫塊來創建對象。下面的例子展示瞭如何使用這種方法來實現你的加載函數。

enum ObjectType 
{ 
    Potion, 
    Sword, 
    Condom 
}; 

template <typename T> 
void List<T>::Load(std::ifstream & file) 
{ 
    //Read the number of elements 
    file.read(reinterpret_cast<char *>(&mNumberOfNodes), sizeof(int)); 

    //Insert nodes into list 

    for(int i = 0; i < mNumberOfNodes; i++) 
    { 
     T* obj = NULL; 
     int nodeType; 

     file.read(reinterpret_cast<char *>(&nodeType), sizeof(nodeType)); 
     switch(nodeType) 
     { 
     case Potion: 
      obj = new Potion(file); 
      break; 

     case Sword: 
      obj = new Sword(file); 
      break; 

     case Condom: 
      obj = new Trojan(file); 
      break; 

     default: 
      throw std::runtime_error("Invalid object type"); 
     } 

     PushFront(&obj); 
    } 
} 

根據您的要求實施工廠功能或類可能會更有益。 This page描述了工廠模式,並提供了示例代碼(使用Java,但易於理解)。