2015-06-27 2 views
1

у меня есть:Как читать значение из вектора без копирования?

class Foo { 

std::vector<Thing>things; 

void bar(); 

} 

Мне нужно изменить Вещь, хранящиеся в вещах в баре:

void bar(){ 
    //How do I read a Thing stored in the vector, without making a copy? 

    Thing thing = things[0]; // Doesn't this make a copy ? 

    //..... 
} 

Как я прочитал вещь, хранящуюся в векторе, не делая копию? Если да, то:

Thing &thing = things[0]; 

Элементы вещи не инициализированы.

+0

Почему малыш просто работа на вещи [0] без сохранения его в переменной темп? –

+0

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

+1

Что означает «члены вещи не инициализированы»? 'thing' не является отдельным объектом в вашем последнем фрагменте кода, поэтому ничего не нужно инициализировать. –

ответ

3

Второй сниппет находится на месте: строка ниже не делает копию.

Thing &thing = things[0]; 

Что-то еще не так с кодом, возможно, с конструктором копирования. Поскольку переменная thing является ссылкой на объект внутри вектора, если вы частично инициализировали thing, объект внутри вектора также частично инициализируется.

Чтобы устранить эту проблему, убедитесь, что ваш код имеет правильный конструктор копирования, и следует за rule of three.

Но зачем мне нужен конструктор копирования, если я использую ссылку?

Поскольку ваш вектор содержит объекты, а не указатели, конструктор копирования вызывается, когда ваш объект вставлен в vector<Thing>. Если конструктор копирования требуется, потому что ваш конструктор выделяет ресурсы, но не предоставляется, ваш объект может быть частично инициализирован, когда вызывается деструктор объекта, который был вставлен в vector.

+0

Но зачем мне нужен конструктор копирования, если я использую ссылку? –

+0

Я не вижу, что с этим связано правило трех. Вещь также просто содержит векторы указателей. –

+0

Правило трех состояний состоит только в том, что если вы объявляете свой собственный конструктор, вам также нужно объявить конструктор копирования и деструктор, вы не можете обойти это. – HyperZ

0

Вы можете использовать указатели.

Thing *thing = &things[0]; 
thing->pong(); 

Если это не инициализирован либо, ваш vector не готов.

+2

Если он не работает со ссылкой, он не будет работать с указателем или итератором. – dasblinkenlight

+0

Не следует использовать указатель, где ссылки будут достаточными. – emlai

+0

Курс @zenith. Это был еще один способ проверить, что в коде что-то еще не было. Я не знал о конструкторе копирования. Лично я считаю, что указатели удобны при работе со списками объектов. Мне не нужно заботиться о передаче материала по ссылке для оптимальности. – prakharsingh95

0

Вы можете использовать iterator:

vector<Thing>::iterator iter = things.begin(); 
//then use iter as a pointer; 
*iter = Thing(); 
+0

* iter уже ссылается на объект. – prakharsingh95

+0

@ prakharsingh95 Я не знаю, что именно вы хотите мне рассказать, но мой код не делает никакой копии «Thing». – DMaster

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