Коллекция абстрактных классов / разных типов классов? - PullRequest
1 голос
/ 05 ноября 2011

Я новичок в C ++, для этого игрового проекта, который я создаю, я хотел бы получить коллекцию универсального элемента "GameObject", каждый с виртуальными методами для Update и Draw ... затем есть классыунаследовав его от своих собственных определений таких методов, чтобы при обновлении мира мне нужно было оставить только одну коллекцию для циклического перебора ...

Кажется, что в Vector невозможно содержать коллекцию абстрактных классовВместо этого я попытался сохранить методы Draw и Update виртуальными, но затем, если я создаю экземпляр Enemy : public GameObject и добавляю его в Vector<GameObject> и вызываю update, я получаю все виды компоновщика: неопределенные ошибки символов ....

Я не знаю, есть кое-что, чего я не понимаю ... Я уверен, что это тот тип настройки, который потребуется многим приложениям .... Какой ваш совет по подходу к этому?Должен ли я попробовать другой тип сборщика, чем Vector?

Большое спасибо

РЕДАКТИРОВАТЬ:

В ответ на ответы ниже, я попытался:

class GameObject{

....

virtual void update(float t):

....
}

//-------------------------------------------


class Enemy: public GameObject{

.....

void update(float d);


.....


void Enemy::update(float d){
    //Have a breakpoint here
}

//-------------------------------------------

class World{
...
vector<GameObject*> gameObjects;
...
}

//-------------------------------------------

class Level{

World levelWorld;

....

Level(){

levelWorld = new World();

}

...


Enemy* en = new Enemy();


levelWorld->visibleObjects.push_back(en);
levelWorld->visibleObjects.at(0)->update(0);

}

И я получаю, как и раньше:

Error   25  error LNK2001: unresolved external symbol "public: virtual void __thiscall Enemy::update(float)" (?update@Enemy@@UAEXM@Z)   

Error   28  error LNK2001: unresolved external symbol "public: virtual void __thiscall GameObject::update(float)" (?update@Object3DS@@UAEXM@Z)  

....

Есть предложения?

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Как указано в Effective C ++ (Скотт Мейерс), вам не следует создавать массивы полиморфных типов. В вашем случае использование vector<GameObject*> будет работать. Но я бы посоветовал использовать auto_ptr или любой другой умный указатель.

0 голосов
/ 05 ноября 2011

Если вы хотите полиморфизм подтипа, вам нужен вектор указателей. В противном случае ваши объекты будут разрезаны. Поскольку вектор необработанных указателей не является безопасным для исключения, я рекомендую вектор общих указателей:

#include <vector>
#include <memory>
// ...
std::vector<std::shared_ptr<GameObject>> gameObjects;
gameObjects.push_back(std::make_shared<Enemy>());
0 голосов
/ 05 ноября 2011

Используйте Vector<GameObject*> (или что-то, что включает ссылки / указатели) вместо Vector<GameObject>.Вы не можете создавать экземпляры абстрактных базовых классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...