programar - funciones en c++ pdf
Fábricas: cómo pasar punteros inteligentes temporales a las funciones. C++ (2)
Puede utilizar la función de miembro get
que devuelve un puntero en bruto al objeto de propiedad.
plainF(createFoo().get());
El temporal creado por createFoo()
no quedará fuera del alcance hasta que plainF
haya finalizado. Siempre que plainF
no pase el puntero fuera de alcance, esto es completamente seguro.
Tengo una clase foo
class Foo;
una fábrica devolviéndole un puntero:
std::unique_ptr<Foo> createFoo();
y, desde que Herb me ha dicho que una función simple sin ningún reclamo especial en la vida de Foo debería tomar los simples indicadores:
void plainf(Foo* f);
¿Cómo se supone que mi cliente haga esto correctamente?
plainF(createFoo());
No sería feliz si tuviera que escribir:
auto someName = createFoo();
plainF(someName.get());
Si no necesita que el argumento de plainF
sea anulable, también puede cambiar su firma para tomar el argumento por referencia, lo que permite una sintaxis ligeramente menos detallada:
std::unique_ptr<Foo> createFoo();
void plainf(Foo& f);
plainF(*createFoo());
Se aplican todas las consideraciones de por vida mencionadas en la respuesta de NathanOliver , por lo que es tan seguro de usar.
Tenga en cuenta que esto implica que createFoo
nunca devolverá un unique_ptr
vacío. Entonces, si se permite que esa función falle, debe indicar ese error a través de otros medios, por ejemplo. lanzando una excepción.