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

时间:2018-06-14 13:04:01

标签: c++ factory smart-pointers temporary

我有一个班级Foo

class Foo;

工厂返回指向它的指针:

std::unique_ptr<Foo> createFoo(); 

并且,因为Herb告诉我,在Foo的生命周期中没有特殊要求的普通函数应该采用简单的指针:

void plainf(Foo* f);

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

plainF(createFoo());

如果他不得不写,他会不高兴的。

auto someName = createFoo();
plainF(someName.get()); 

2 个答案:

答案 0 :(得分:39)

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

plainF(createFoo().get());

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

答案 1 :(得分:21)

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

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

plainF(*createFoo());

NathanOliver's answer中提到的所有生命周期考虑因素均适用,因此使用起来同样安全。

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