Главный вопрос:
Как создать указатель на переменную, которую можно сохранить, а затем использовать для доступа к этой переменной позже. Без создания копии
Ниже приводится только ответ на любые вопросы, которые могут возникнуть у людей относительно того, почему я хочу это делать.
Пролог:
Я делаю игру с DirectX, и я хочу создать "список" сущностей (специальный класс) в другом классе. Я хочу сделать это, чтобы я мог отслеживать все объекты в игре, которые отображаются определенным методом (один список для треугольников, другой для строк и т.д.). Для этого у меня первоначально был класс, и у него был std::vector<Entity>
, тогда у класса была функция add(Entity entity)
которая добавила бы указанный объект в вектор. Это получилось очень хорошо, пока я не начал пытаться внести изменения в эти объекты в вектор.
Проблема:
Сначала я бы создал объект в цикле основного мира, Entity testEntity = Entity(position);
то я бы добавил его в список сущностей, entityList.add(testEntity);
, Когда эта команда вызывается, она на самом деле просто создает копию объекта, как это было в то время, когда была вызвана команда добавления. Это означает, что внезапно появляются 2 сущности, которые представляют 1, объект в основном мире, на который воздействует вся логика игры, и сущность в объекте entityList, который не обновляет, а визуализирует. Эти два не синхронизированы.
Желаемый эффект:
Объект entityList std::vector
на самом деле просто заполнен каким-то указателем на сущности в цикле мира. Затем, когда объект обновляется в цикле мира, entityList имеет те же данные для этого объекта.
Мне не совсем ясно, где у вас проблемы, поэтому это не может ответить на вопрос:
Похоже, вы хотите просто сохранить вектор указателей на объекты Entity. Т.е. std::vector<Entity*>
.
Если вы знаете, что testEntity будет областью действия для вектора жизни, вы можете просто добавить указатель на него в вектор. Т.е. entityList.add(&testEntity)
.
Если это предположение неверно, вы, вероятно, захотите выделить объекты Entity в куче (например, Entity* testEntityPtr = new Entity(position);
Если вы используете С++ 11 (или, может быть, даже если вы не), вы, вероятно, захотите использовать shared_ptr и make_shared в этой ситуации.
RenderController->entities->at(i)->getVertices();
: RenderController->entities->at(i)->getVertices();
где RenderController
- это класс, который представляет собой entityList
. Он выдает ошибку, говорящую, что RenderController is illegal use of this type of expressions
и для каждой вызываемой вещи ( at()
, getVertices()
и entities
) в той строке, которая, как он говорит, must point to a class/stuct/union/generic type
Entity * tempEntity = RenderController::entities.at(i);
временную сущность Entity * tempEntity = RenderController::entities.at(i);
и затем используйте tempEntity
вместо RenderController->entities->at(i)
это работает. Можете ли вы объяснить, почему это так?
Вы можете использовать семантику c++ 11 Move для сохранения ваших данных. Если у Entity
есть элементы указателя, которые указывают на некоторые выделенные данные, которые вы не хотите копировать, вы можете реализовать семантику Move, которая по существу передает передачу права собственности на копию, которую вы помещаете в вектор. Например:
Entity(Entity&& entity)//move constructor
{
this->data = std::move(entity.data);
//and so on.
}
Вам также понадобится оператор "Переместить присваивание" Entity& operator=(Entity&& entity);
Для получения дополнительной информации вам нужно будет найти "Переместить семантику" и "ссылки rvalue".
Надеюсь, это поможет.
&
? Я еще не прочитал остальную часть вопроса, но пока не уверен, что вы ищете.