tipos programar parametros funciones ejemplos datos con como comandos codigos c++ factory smart-pointers temporary

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.