Как я могу получить производный класс от интерфейса? - PullRequest
0 голосов
/ 24 июня 2019

При попытке создать Entity-Component-System в C ++ я столкнулся с некоторыми проблемами, связанными с недостатком знаний языка.

С классом Entity , который содержит интерфейс IComponent (который больше похож на флаг с надписью "Я храню данные"), у меня есть метод Add , который добавляет Компонент к сущности, если в нем уже нет другого IComponent того же класса.

Вот пример упрощенного кода:

struct IComponent{};

struct Foo : IComponent{ int x;};
struct Bar : IComponent{ int y; };

class Entity{
    vector<IComponent*> entityComponents;

    void Add(IComponent* componentToAdd){
        if("entityComponents" does not contain the class of "componentToAdd")
            entityComponents.add (componentToAdd)

    }
}

Мой ожидаемый результат будет

Entity e;
Foo f;
Bar b;
Foo anotherF;

e.Add(f); // Works
e.Add(b); // Works
e.Add(anotherF); // Does not work because another 
                 //item in the array already inherits Foo

Но я не знаю, как получить базовый класс Foo и Bar из списка IComponents и проверить, повторяются ли они.

Как я могу получить их? Как я могу привести IComponent к Foo, если Foo есть в списке IComponent?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Как указано Барный стул , мое решение было

template<typename T>
bool HasComponent(){
  for(Component* component: this->components)
        if(T* casted = dynamic_cast<T*>(component))
                return true;           
  return false;

}

А позже просто проверьте, имеет ли значение "HasComponent ()" значение false, а затем добавьте его

1 голос
/ 24 июня 2019

Оформить заказ dynamic_cast . Вы можете попытаться привести указатель к базовому классу к указателю на производный класс. Сбой, если экземпляр объекта не относится к производному типу и в этом случае возвращает ноль.

...