[英]std::list static_cast derived iterator
我有一個列表定義為:
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;
}
您已經有了區分類類型的方法,為什么不使用它呢?
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).name(),它將為您提供“類名”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.