std::list производный итератор 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;
    }

person Sting    schedule 30.10.2015    source источник
comment
Что вы собираетесь делать с информацией о том, какой это класс?   -  person Neil Kirk    schedule 30.10.2015
comment
Каждый класс реализует определенные функции-члены, и на основе его класса я смогу узнать, какой метод вызывать.   -  person Sting    schedule 30.10.2015
comment
Вы не можете реализовать это с помощью виртуальных функций?   -  person Neil Kirk    schedule 30.10.2015


Ответы (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";
   }
}

Существует также проверка идентификатора типа во время выполнения: typeid(*iter).name(), которая даст вам «имя класса»

person Nandu    schedule 30.10.2015