Как получить объект внутри вектора в C ++ - PullRequest
3 голосов
/ 11 января 2012

Я - программист на C ++ noob ... (я обычно использую Java), и теперь у меня есть некоторые проблемы с указателями, ссылками и векторами ...

Мне нужно извлечь Object из vector<Object> objects, и для простоты я хотел бы сохранить его ссылку в другом объекте, потому что мне нужно много раз редактировать некоторые параметры внутри него

это код, который я написал до сих пор:

Object myObject = getMyObject(id, objects); 

и getMyObject просто реализуют цикл for, который находит правильное object с правом id и возвращает его с return objects[i]

но если я правильно понял, этот метод дублирует объекты! Итак, в myObject есть совершенно другой Object, верно?

Как мне поступить ??

Большое спасибо!

Ответы [ 5 ]

3 голосов
/ 11 января 2012

Да, вам нужно использовать либо указатель, либо ссылку, в противном случае показанная вами строка вызовет конструктор копирования Object.

Вы можете сделать getMyObject return Object*, и тогда у вас есть указатель на объект, и вы можете назначить его другому Object*.

В качестве альтернативы, определите myObject как ссылку: Object& myObject.

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

Вы также должны убедиться, что объект освобожден, чтобы предотвратить утечку памяти.

2 голосов
/ 11 января 2012

Если вы не хотите дублировать объект, вам нужна ссылка или указатель на него.Проблема в том, что ссылка или указатель могут легко стать недействительными.Если вы не хотите, чтобы это произошло, вы должны хранить указатели в вашем векторе.Специально для этого случая вы, скорее всего, захотите shared_ptr.

std::shared_ptr<Object> getMyObject(foo id,
    const std::vector<std::shared_ptr<Object>> & objects)
{
    // ... find object
    ...
    return objects[i];
}
...
std::vector<std::shared_ptr<Object>> objects;
objects.emplace_back(new Object(parameters));
...
std::shared_ptr<Object> x = getMyObject(id, objects);
1 голос
/ 11 января 2012

Имейте в виду, что STL всегда копирует, если не указано иное. Однако vector at () и operator [] оба возвращают ссылку.

Вам нужно

Object& myObject = objects.at(id);

, если вы хотите изменить объекты, находящиеся внутри коллекции.

Object myObject = objects.at(id);

даст вам копию.

1 голос
/ 11 января 2012

Ты прав.То, что вы должны сделать, это заставить функцию get вернуть ссылку:

Object & getMyObject(int id, std::vector<Object> & objects)
{
    // ... find ...
    return objects[i];
}

Затем связать это с другой ссылкой в ​​вашем коде пользователя:

Object & theobject = getMyObject(12, all_objects);

Теперь вы изменяете содержащийся элемент напрямую черезссылка theobject.

Если вы не хотите / не хотите изменять объект, просто осмотрите их, вы должны сделать ссылку (а также контейнер) const:

Object const & getMyObject(int id, std::vector<Object> const & objects);
0 голосов
/ 11 января 2012

Вместо этого сохраняйте указатели на оригинальные объекты в контейнере.

Object* obj1 = new Object();
Object* obj2 = new Object();

vector<Object*> myVector;
myVector.push_back(obj1);
myVector.push_back(obj2);

Object* tmpObj = myVector.at(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...