Эффективное хранение полиморфных игровых объектов в контейнере C ++

Для 2D-игры, над которой я работаю, я создал вектор указателей на объект. Этот объект является родительским классом, от которого наследуются все другие игровые объекты. Таким образом, актер — это такой объект, предметы, враги и т. Д. Класс, содержащий этот вектор (менеджер объектов), выполняет виртуальные функции этого класса, такие как run () и draw ().

Для меня это была простая реализация, о которой я тогда не задумывался. Теперь я дошел до того, что мне действительно нужно удалить объекты из контейнера. Некоторые быстрые поиски в Интернете говорят мне, что для этой задачи подходит правильная реализация вектора (с использованием swap и pop), но также и то, что я должен хранить сами объекты в векторе для еще большей производительности. Итак: не указатели, а фактические случаи. Таким образом, они расположены в стеке, я думаю. Возможно ли это даже при использовании наследования? И есть ли еще более быстрый способ хранения унаследованных игровых объектов?

0

Решение

Возможно ли это даже при использовании наследования?

Нет, невозможно хранить полиморфные объекты в контейнере без использования указателя или ссылки.

Я бы сделал это с помощью комбинации 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 являются производными классами.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector