2015-10-30 35 views
0

我有一個列表定義爲:的std ::名單的static_cast衍生迭代

std::list<CExcited*> mExcitedList; 

興奮的定義是:

class CExcited 
{ 
public: 
    CExcited::CExcited(){} 
    virtual int getAnswer() = 0; 
}; 

我有一個派生類:

class CExcitedA :: public CExcited 
{ 
public: 
    CExcitedA::CExcitedA(){} 
    int getAnswer() {return 1;} 
}; 

而且另:

class CExcitedB :: public CExcited 
{ 
public: 
    CExcitedB::CExcitedB(){} 
    int getAnswer() {return 2;} 
}; 

我一些元素添加到列表中

CExcitedA* excitedA = new ExcitedA(); 
mExcitedList.add_back(excitedA); 

CExcitedB* excitedB = new ExcitedB(); 
mExcitedList.add_back(excitedB); 

,當我重複的名單,我不能工作,如何找出在被它,我已經添加了類運行時。

我試圖無濟於事

for (std::list<Excited*>::iterator iter = mExcitedList.begin(); iter != mExcitedList.end(); iter++) 
{ 
    if (typeid(*iter) == typeid(CExcitedA*)) 
    { 
    } 
    if (typeid(dynamic_cast<CExcitedA*>(*iter)) == typeid(CExcitedA*)) 
    { 
    } 
} 

這似乎應該是簡單的,但我不能夠得到它。

編輯從這裏的答案

CExcitedA* testA = dynamic_cast<CExcitedA*> (*iter); 
    if (testA != 0) 
    { 
     std::cout << "ES: " << dynamic_cast<CExcitedA*> (*iter)->getAnswer() << std::endl; 
    } 

    CExcitedB* testB = dynamic_cast<CExcitedB*> (*iter); 
    if (testB != 0) 
    { 
     std::cout << "EB: " << dynamic_cast<CExcitedB*> (*iter)->getAnswer() << std::endl; 
    } 
+0

你打算什麼類的信息做是什麼? –

+0

每個類都實現了特定的成員函數,並且基於它的類我將能夠知道調用哪個方法。 – Sting

+0

你不能用虛函數來實現這個嗎? –

回答

1

你已經有了辨別類類型爲什麼不使用它的手段?

for (std::list<Excited*>::iterator iter = mExcitedList.begin(); iter != mExcitedList.end(); iter++){ 
{ 
    int classType = iter->getAnswer(); 
    switch (classType) { 
    case 1: cout << "class A"; 
      break; 
    case 2: cout << "class B"; 
      break; 
    default: cout << "unknown class"; 
    } 
} 

另外也運行時類型ID檢查: typeid的(* ITER)。名稱(),會給你「類名」