Составление списка переменных без их копирования

0

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


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

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

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

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

  • 0
    «Как создать указатель на переменную, которая может быть сохранена и затем использована для доступа к этой переменной в более позднее время без создания копии» - с помощью оператора & ? Я еще не прочитал остальную часть вопроса, но пока не уверен, что вы ищете.
Теги:
pointers
reference

2 ответа

2
Лучший ответ

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

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

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

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

  • 0
    Я не знаю, работает ли это, но в процессе реализации этого я столкнулся с ошибкой, когда я пытаюсь использовать эти объекты в функциях класса entityList. 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
  • 0
    Продолжение ... Но когда я Entity * tempEntity = RenderController::entities.at(i); временную сущность Entity * tempEntity = RenderController::entities.at(i); и затем используйте tempEntity вместо RenderController->entities->at(i) это работает. Можете ли вы объяснить, почему это так?
Показать ещё 1 комментарий
0

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

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

Вам также понадобится оператор "Переместить присваивание" Entity& operator=(Entity&& entity);

Для получения дополнительной информации вам нужно будет найти "Переместить семантику" и "ссылки rvalue".

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню