C ++: получить унаследованный тип из вектора абстрактного указателя

0

Итак, у меня есть вектор, который содержит указатели абстрактного класса Component
, и, допустим, у меня есть 2 унаследованных класса из компонента, foo и bar, есть ли способ получить указатель с типом "foo" из этого вектора?

    vector<Component*> components;
    class foo : Component;
    class bar : Component;
    components.push_back(new foo());
    components.push_back(new bar());

Благодарю.

  • 2
    Это похоже на плохой дизайн, но это только мое мнение.
  • 0
    Каждый компонент выполняет совершенно другую работу, чем другой, они почти ничего общего не имеют ... Класс держателя проходит по всем компонентам и вызывает все их виртуальные методы. это лучший способ думать о
Показать ещё 2 комментария
Теги:
pointers
vector
inheritance

2 ответа

2
Лучший ответ

Ага:

Component* c = components[0];
if (foo* f = dynamic_cast<foo*>(c)) {
    // use f
}
else {
    // c is not a foo. Maybe it a bar, or something else
}

Поэтому, если вы хотите написать функцию для поиска foo*, вы можете сделать это (предполагая С++ 11):

foo* find_foo(const std::vector<Component*>& components)
{
    for (auto c : components) {
        if (foo* f = dynamic_cast<foo*>(c)) {
            return f;
        }
    }
    return nullptr;
}

Листинг, dynamic_cast<foo*> либо вернет действительный foo* либо nullptr, он не будет бросать. Из стандарта §5.2.7.9:

Значение неудавшегося нажатия на тип указателя - это нулевое значение указателя требуемого типа результата.

  • 0
    Будет ли эта работа даже если класс не содержит виртуальных?
  • 0
    @ user3562972 нет, они должны быть виртуальными. Если это не так, приведение не будет компилироваться, так как тип источника должен быть полиморфным.
Показать ещё 2 комментария
1

Да, вы можете это сделать, используя концепции RTTI: -

#include <typeinfo>
//Using for loop iterate through all elements
if ( typeid(*iter) == typeid(Foo) )
  //You got the Foo object

Но это почти никогда не предпочтительнее в C++.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню