工厂:如何将临时智能指针传递给函数.C++

jim*_*iki 23 c++ factory smart-pointers temporary

我有一堂课Foo

class Foo;
Run Code Online (Sandbox Code Playgroud)

工厂返回指针:

std::unique_ptr<Foo> createFoo(); 
Run Code Online (Sandbox Code Playgroud)

因为Herb告诉我,在Foo的一生中没有特别要求的普通函数应该采用简单的指针:

void plainf(Foo* f);
Run Code Online (Sandbox Code Playgroud)

我的客户应该如何正确地做到这一点?

plainF(createFoo());
Run Code Online (Sandbox Code Playgroud)

如果他不得不写,他会不高兴:

auto someName = createFoo();
plainF(someName.get()); 
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 39

您可以使用get成员函数返回对所拥有对象的原始指针.

plainF(createFoo().get());
Run Code Online (Sandbox Code Playgroud)

创建的临时文件在完成createFoo()之前不会超出范围plainF.只要plainF没有将指针传递出范围,这就完全安全了.

  • @lubgr传递指针基本上是在玩一生.将指针向上传递出范围将延长它的生命周期,因为它不拥有指针,所以它不应该对它做出终身决定. (8认同)

Com*_*sMS 21

如果您不需要将参数设置plainF为可为空,那么您还可以更改其签名以通过引用获取参数,从而允许稍微冗长的语法:

std::unique_ptr<Foo> createFoo(); 
void plainf(Foo& f);

plainF(*createFoo());
Run Code Online (Sandbox Code Playgroud)

NathanOliver的答案中提到的所有生命周期考虑都适用,因此使用起来同样安全.

请注意,这意味着createFoo永远不会返回空unique_ptr.因此,如果允许该功能失败,您必须通过其他方式指出该错误,例如.通过抛出异常.