У меня есть класс:Как получить настоящее имя экземпляра класса из вектора?
class IComponent{};
И я использую его как базовый класс для других конкретных классов.
class First : public IComponent{public: void First();};
class Second : public IComponent{public: void Second();};
И у меня есть объект класса, у которого есть вектор, который хранит классы, унаследованные от IComponent.
vector<IComponent*> vectorOfComponents;
В этом классе у меня есть метод шаблона, который добавляет компонент в вектор.
template<typename comp>
void AddComponent() {
comp * c = new comp();
getComponents().push_back(c);
}
Но я хочу также, чтобы иметь возможность получить компоненты определенного типа, так что я создал этот метод:
template<typename comp>
comp * GetComponent()
{
comp component;
for (int i = 0; i < GetComponentsCount(); i++)
if (typeid(*getComponents()[i]).name() == typeid(component).name())
return (comp*)getComponents()[i];
return NULL;
}
И когда я потом запустить его:
if (obj.GetComponent<FirstClass>() != NULL)
std::cout << "isn't null\n";
else
std::cout << "is null\n";
Я знаю, этот вектор сохраняет нажатые экземпляры наследуемого класса IComponent, но он всегда печатает меня как null, потому что первый typeid() показывает мне IComponent, а второй показывает конкретный унаследованный компонент.
Как получить конкретный тип от вектора? Я попытался полиморфизм, но это не работает, или я делаю что-то неправильно:
template<typename comp>
void AddComponent() {
comp c = comp();
IComponent * i = &c;
getComponents().push_back(i);
}
Вы можете добавить чистую виртуальную функцию в 'IComponent', которая возвращает идентификатор. Производные классы затем вынуждены реализовать эту функцию, чтобы вы могли спросить их об их типе. – Unimportant
Интересно, что вы думаете, что это имеет какое-либо отношение к векторам. Типы и объекты не изменяют свои характеристики за счет сохранения в векторе. – juanchopanza
@juanchopanza Типы реализации собственности способны внедрять полиморфизм. Например, 'shared_ptr' работает с динамическим типом своего объекта, даже если он сужается до неполиморфного базового указателя. Также в этом вопросе упоминается полиморфизм шаблона времени компиляции. Короткий длинный рассказ ... Полиморфизм в C++ большой, утомительный и сложный. – Potatoswatter