Sé que el título me suena familiar, ya que hay muchas preguntas similares, pero estoy pidiendo un aspecto diferente del problema (sé la diferencia entre tener cosas en la pila y ponerlas en el montón).¿Cómo "devolver un objeto" en C++?
En Java siempre puede volver referencias a "local" objetos
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
En C++, hacer algo similar tengo 2 opciones
(1) Puedo utilizar referencias siempre que necesito " retorno" un objeto
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
luego usarlo como esto
Thing thing;
calculateThing(thing);
(2) o puedo devolver un puntero a un objeto asignado dinámicamente
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Entonces utilizar de esta manera
Thing* thing = calculateThing();
delete thing;
Usando el primer enfoque no voy a tener que liberar memoria de forma manual, pero para mí hace que el código sea difícil de leer. El problema con el segundo enfoque es, tendré que recordar al delete thing;
, que no se ve muy bien. No quiero devolver un valor copiado porque es ineficiente (creo), así que aquí vienen las preguntas
- ¿Existe una tercera solución (que no requiera copiar el valor)?
- ¿Hay algún problema si me atengo a la primera solución?
- ¿Cuándo y por qué debería usar la segunda solución?
+1 por muy bien plantear la pregunta. – Kangkan
Para ser muy pedante, es un poco impreciso decir que "las funciones devuelven algo". Más correctamente, * la evaluación de una llamada de función produce un valor *. El valor siempre es un objeto (a menos que sea una función vacía).La distinción es si el valor es un glvalue o un prvalue, que está determinado por si declarado * return type * es una referencia o no. –