std :: векторы в классах - PullRequest
       4

std :: векторы в классах

1 голос
/ 02 октября 2011

Я создаю программу на С ++, и мне нужно хранить неопределенное (т. Е. Динамическое) количество изображений в классе.У меня также есть неопределенное количество спрайтов, которые могут отображать эти изображения.Прямо сейчас у меня есть что-то вроде этого:

class Hud {
  std::vector<Image> images;
  std::vector<Sprite> sprites;
}

Чтобы избежать дублирования изображений (тем самым занимая слишком много памяти), я повторно использую их, помещая указатель на изображение в объекте Sprite.

Очевидно, что когда изображение добавляется в std :: vector, эти указатели перестают быть полезными.Возможно, что-то не так с моим подходом, но я не уверен, как это исправить.Рендеринг выполняется в OpenGL.Любые предложения будут полезны.

Как я могу хранить динамический массив изображений, к которым могут обращаться мои спрайтовые объекты, и это позволит мне избежать дублирования изображений в памяти (что может быть крайне затруднительно для эффектов частиц)?Альтернативные методы приветствуются, но я не могу позволить себе потратить больше одного дня или двух на переписывание моего кода.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Вы должны хранить список shared_ptr, а не список Image объектов.Таким образом, список и Sprite классы могут совместно использовать владельца.Действительно, если вы не хотите, чтобы Sprite действительно владел изображением, они могли бы хранить weak_ptr вместо shared_ptr.Хотя более вероятно, что вы захотите, чтобы сам список представлял собой список weak_ptr.

Если вы не используете компилятор с поддержкой TR1 или C ++ 11, тогда вы можете получить эти умные указателиот Boost.

В качестве альтернативы вы можете использовать std::list.Таким образом, вы можете вставлять и удалять из списка все, что душе угодно, без аннулирования указателей.

1 голос
/ 02 октября 2011

Вы можете хранить указатели на объекты в ваших векторах, убедившись, что delete объекты, прежде чем стереть их из вектора. Общая библиотека указателей Boost может упростить эту задачу.

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