2012-05-11 16 views
11

Quiero devolver una referencia de un objeto de un vector, y el objeto está en un objeto iterador. ¿Cómo puedo hacer eso?referencia de devolución de un objeto de un iterador

He intentado lo siguiente:

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 
} 

En el código, customerList es un vector de clientes, y la función getId devuelve el identificador del cliente.

¿Es correcto el *i? ¿Y cómo puedo devolver 0 o nulo como referencia?

Respuesta

18

return *i; es correcto, sin embargo, no puede devolver 0 ni ningún otro valor. Considere lanzar una excepción si el Cliente no se encuentra en el vector.

También tenga cuidado al devolver las referencias a los elementos en el vector. Insertar nuevos elementos en el vector puede invalidar su referencia si el vector necesita reasignar su memoria y mover los contenidos.

+0

Alternativamente, podría devolver un puntero. Algo parecido a 'return i! = CustomerList.end()? & * i: NULL; '. –

+0

Es casi posible crear una referencia nula con algo de fundición dudosa, pero una * realmente * mala idea, y probablemente UB en casi todas las circunstancias posibles. – BoBTFish

+0

Sí, depende mucho del uso esperado de la función. Si la expectativa inicial al llamar a la función es que el cliente debería existir, entonces lanzar una excepción tiene sentido. Si su propósito es más de preguntar "¿existe el cliente, y si lo hace, devolver al cliente?", Entonces devolver un tipo de nullable tiene más sentido. –

3

No existe una referencia "nula": si su método obtiene una identificación que no está en el vector, no podrá devolver ningún valor significativo. Y como señala @reko_t, incluso una referencia válida puede volverse inválida cuando el vector reasigna sus partes internas.

Solo debe usar los tipos de devolución de referencia cuando siempre puede devolver una referencia a un objeto existente que permanecerá válido durante un tiempo. En tu caso, ninguno está garantizado.

+0

+1 por mencionar el problema de la validez (que es válido independientemente de si la función devuelve una referencia, un puntero o un iterador). –

Cuestiones relacionadas