2014-01-28 5 views
0

Главный вопрос:
Как создать указатель на переменную, которая может быть сохранена, а затем используется для доступа к этой переменной в более позднее время Без копии быть созданоСоставление списка переменных без их копирования


внизу здесь просто ответить на любые вопросы, которые люди могли бы иметь, почему я хочу сделать это

Пролог:
Я сделать игру с DirectX и я хочу, чтобы создать «список» лиц (особый класс) в другом классе. Я хочу сделать это, чтобы я мог отслеживать все объекты в игре, которые отображаются определенным методом (один список для треугольников, другой для строк и т. Д.). Для этого у меня первоначально был класс, и у него был std::vector<Entity>, тогда у класса была функция add(Entity entity), которая добавила бы указанный объект в вектор. Это получилось очень хорошо, пока я не начал пытаться внести изменения в эти объекты в вектор.

Проблема:
Сначала я хотел бы создать объект в главном мировом цикле, Entity testEntity = Entity(position); то я хотел бы добавить его в список сущностей, entityList.add(testEntity);. Когда эта команда вызывается, она на самом деле просто создает копию объекта, как это было в то время, когда была вызвана команда добавления. Это означает, что внезапно появляются 2 объекта, которые представляют 1, сущность в основном мире, на которую воздействует вся логика игры, и сущность в сущности, которая не обновляется, , но. Эти два не синхронизированы.

Желаемый эффект:
EntityList-х std::vector на самом деле просто наполнен каким-то указатель на лицо в мировом цикле. Затем, когда объект обновляется в цикле мира, entityList имеет те же данные для этого объекта.

+0

«Как создать указатель на переменную, которая может быть сохранена, а затем использоваться для доступа к этой переменной позднее? Без создания копии» - с помощью оператора '&'? Я еще не прочитал остальную часть вопроса, но до сих пор я не уверен, что вы ищете. – user2357112

ответ

2

Это не совсем ясно мне, где у вас возникли проблемы, так что это не может ответить на вопрос:

Похоже, вы просто хотите сохранить вектор указателей на объекты Entity. То есть std::vector<Entity*>.

Если вы знаете, что testEntity будет в пределах срока действия вектора, вы можете просто добавить указатель на него в вектор. То есть entityList.add(&testEntity).

Если это предположение неверно, вы, вероятно, захотите выделить объекты Entity в куче (например, Entity* testEntityPtr = new Entity(position);. Если вы используете C++ 11 (или, может быть, даже если это не так), вы, вероятно, захотите для использования shared_ptr и make_shared в этой ситуации.

+0

Я не знаю, работает ли это, но в процессе его реализации я столкнулся с ошибкой, когда пытаюсь использовать эти сущности в функциях класса entityList. EX: 'RenderController-> entity-> at (i) -> getVertices();' где 'RenderController' - класс, который является' entityList'. Это порождает ошибку, говорящую о том, что «RenderController является незаконным использованием этого типа выражений» и для каждой вещи, называемой ('at()', 'getVertices()' и 'entities') в этой строке, которая говорит' должна указывать на class/stuct/union/generic type' –

+0

Продолжение ... Но когда я инициализирую временную сущность 'Entity * tempEntity = RenderController :: entities.at (i);' и затем используйте 'tempEntity' вместо' RenderController- > entity-> at (i) 'он работает. Можете ли вы объяснить, почему это так? –

+0

Не уверен, но если вы буквально вставили свой код, ваша нерабочая версия говорит RenderController->, и ваша рабочая версия говорит RenderController ::. Вероятно, вам нужен RenderController :: в обоих случаях. – happydave

0

Вы можете использовать C++ 11 Move Semantics для сохранения ваших данных. Если Entity имеют элементы указателя, которые указывают на некоторые выделенные данные, которые вы не хотите копировать, вы можете реализовать семантику Move который по существу передаст право собственности на копию, которую вы размещаете в векторе. Например:

Entity(Entity&& entity)//move constructor 
{ 
    this->data = std::move(entity.data); 
    //and so on. 
} 

Вам также потребуется «оператор присваивания» Move Entity& operator=(Entity&& entity);

Вам нужно будет искать «Move Семантика» и «RValue ссылки» для получения дополнительной информации.

Надеюсь, это поможет.

Смежные вопросы