Me estoy moviendo de Java a C++ y estoy un poco confundido con la flexibilidad del idioma. Un punto es que hay tres formas de almacenar objetos: un puntero, una referencia y un escalar (almacenar el objeto si lo entiendo correctamente).¿Cuándo devolver un puntero, escalar y referencia en C++?
Tiendo a utilizar referencias siempre que sea posible, porque eso es lo más parecido posible a Java. En algunos casos, p. captadores de atributos derivados, esto no es posible:
MyType &MyClass::getSomeAttribute() {
MyType t;
return t;
}
Esto no compila, porque t
existe sólo dentro del ámbito de getSomeAttribute()
y si vuelvo una referencia a él, sería apuntar a ninguna parte antes de que el cliente puede usarlo .
Por lo tanto me quedo con dos opciones:
- devolver un puntero
- retornar un escalar
devolviendo un puntero se vería así:
MyType *MyClass::getSomeAttribute() {
MyType *t = new MyType;
return t;
}
Este trabajo, pero el cliente tendría que marcar este puntero para NULL
para poder realmente seguro, algo que no es necesario con referencias. Otro problema es que la persona que llama debería asegurarse de que t
está desasignado, prefiero no lidiar con eso si puedo evitarlo.
La alternativa sería la de devolver el objeto en sí (escalar):
MyType MyClass::getSomeAttribute() {
MyType t;
return t;
}
Eso es bastante sencillo y justo lo que quiero en este caso: Se siente como una referencia y no puede ser nulo. Si el objeto está fuera del alcance en el código del cliente, se elimina. Bastante práctico. Sin embargo, rara vez veo a alguien haciendo eso, ¿hay alguna razón para eso? ¿Hay algún tipo de problema de rendimiento si devuelvo un escalar en lugar de un puntero o referencia?
¿Cuál es el enfoque más común/elegante para manejar este problema?
"Me estoy moviendo de Java a C++" no significa nada. Java no es C++. Java nunca será C++. Pensar en Java mientras se programa C++ no lo ayudará a comprender C++ ni a tomar buenas decisiones. Cualquier idioma no le ayudará a programar un buen C++, excepto C++, así que olvide que conoce otros idiomas, porque no son C++. Tienes que aprender C++ si quieres programar en C++, no tratar de transformar un lenguaje preexistente en C++, porque eso no funcionará, ya que solo C++ es C++. [¿Puedo sugerir un buen libro?] (Http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – GManNickG
Una referencia no está cerca de lo que hace Java. La construcción de lenguaje más cercana a Java sería devolver un puntero. Pero eso no tiene en cuenta la gestión de la memoria. Por lo tanto, la construcción de C++ más cercana a Java sería devolver un puntero compartido. std :: tr1 :: shared_ptr (o std :: shared_ptr o boost :: shared_ptr (dependiendo de la versión que esté usando)). Puede actualizar y olvidar el contenido de su corazón y, por lo general, el objeto será recogido correctamente. Pero C++ no es Java. Debe aprender a usar los valores correctamente. No traiga conceptos de Java a C++, los idiomas son simplemente diferentes. –
@Gman - Ok, así que C++ no es Java, pero ignora los detalles del lenguaje. las ideas expresadas en Java se pueden traducir a C++. A menudo programo en varios idiomas, a menudo la sintaxis difiere pero no la semántica. – brumScouse