Для 2D-игры, над которой я работаю, я создал вектор указателей на объект. Этот объект является родительским классом, от которого наследуются все другие игровые объекты. Таким образом, актер — это такой объект, предметы, враги и т. Д. Класс, содержащий этот вектор (менеджер объектов), выполняет виртуальные функции этого класса, такие как run () и draw ().
Для меня это была простая реализация, о которой я тогда не задумывался. Теперь я дошел до того, что мне действительно нужно удалить объекты из контейнера. Некоторые быстрые поиски в Интернете говорят мне, что для этой задачи подходит правильная реализация вектора (с использованием swap и pop), но также и то, что я должен хранить сами объекты в векторе для еще большей производительности. Итак: не указатели, а фактические случаи. Таким образом, они расположены в стеке, я думаю. Возможно ли это даже при использовании наследования? И есть ли еще более быстрый способ хранения унаследованных игровых объектов?
Возможно ли это даже при использовании наследования?
Нет, невозможно хранить полиморфные объекты в контейнере без использования указателя или ссылки.
Я бы сделал это с помощью комбинации std::vector
а также std::unique_ptr
:
template<class T> using container = std::vector<std::unique_ptr<T>>;
container<base> vector;
Толкание осуществляется через:
vector.emplace_back(std::unique_ptr<base>(new item()));
vector.emplace_back(std::unique_ptr<base>(new enemy()));
где base
это базовый класс и item
а также enemy
являются производными классами.
Других решений пока нет …