2012-05-11 1 views
11

Я хочу вернуть ссылку объекта из вектора, и объект находится в объекте итератора. Как я могу это сделать?ссылка на возврат объекта из итератора

Я попытался следующие:

Customer& CustomerDB::getCustomerById (const string& id) { 
    vector<Customer>::iterator i; 
    for (i = customerList.begin(); i != customerList.end() && !(i->getId() == id); ++i); 

    if (i != customerList.end()) 
     return *i; // is this correct? 
    else 
     return 0; // getting error here, cant return 0 as reference they say 
} 

В коде CustomerList вектор клиентов, а функция GetId возвращает идентификатор клиента.

Правильно ли это *i? И как я могу вернуть 0 или null в качестве ссылки?

ответ

18

return *i; Правильно, однако вы не можете вернуть 0 или любое другое такое значение. Рассмотрите возможность исключения исключения, если Клиент не найден в векторе.

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

+0

В качестве альтернативы, он мог бы вернуть указатель. Что-то похожее на 'return i! = CustomerList.end()? & * i: NULL; '. –

+0

Это просто возможность создать нулевую ссылку с некоторым iffy-литьем, но это действительно «плохая идея» и, скорее всего, UB практически во всех возможных обстоятельствах. – BoBTFish

+0

Да, это зависит от ожидаемого использования функции. Если начальное ожидание при вызове функции состоит в том, что клиент должен существовать, то бросание исключения имеет смысл. Если его цель состоит в том, чтобы спросить: «существует ли клиент, а если он это делает, верните клиента», то возврат нулевых типов имеет больше смысла. –

3

Нет такой вещи, как ссылка «null»: если ваш метод получает идентификатор, отсутствующий в векторе, он не сможет вернуть сколько-нибудь значимое значение. И, как указывает @reko_t, даже действительная ссылка может стать недействительной, когда вектор перераспределяет внутренние элементы.

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

+0

+1 для упоминания вопроса о допустимости (который действителен независимо от того, возвращает ли функция ссылку, указатель или итератор). –

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