He escrito un método de fábrica estático que devuelve un nuevo objeto Foobar poblado de otro objeto de datos. Recientemente he estado obsesionado con la semántica de la propiedad y me pregunto si estoy transmitiendo el mensaje correcto al hacer que este método de fábrica devuelva un unique_ptr
.¿Existe una mala práctica para devolver unique_ptr para el puntero sin formato como semántica de propiedad?
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
Mi intención es decirle al código del cliente que poseen el puntero. Sin un puntero inteligente, simplemente devolvería Foobar*
. Sin embargo, me gustaría hacer que se elimine esta memoria para evitar posibles errores, por lo que unique_ptr
parecía una solución adecuada. Si el cliente desea extender la vida útil del puntero, simplemente llama al .release()
una vez que obtiene el unique_ptr
.
Foobar* myFoo = Foobar::factory(data).release();
Mi pregunta viene en dos partes:
- ¿Este enfoque transmitir la semántica de propiedad correctos?
- ¿Es esto una "mala práctica" devolver
unique_ptr
en lugar de un puntero sin formato?
usted está volviendo un unqiue_ptr decirle al cliente que poseen el puntero? Esto es exactamente lo contrario de lo que esperaría (ya que tienen que apropiarse explícitamente del puntero único). – jknupp
Es posible que desee usar move-semántica en su lugar (si puede usar C++ 11). Con esto, le corresponde al usuario decidir cómo prolongar la vida útil del objeto creado por la fábrica. – evnu
@evnu eso es algo que se hace automáticamente, ¿no? –