簡體   English   中英

std :: list static_cast派生的迭代器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM