工厂:如何将临时智能指针传递给函数。 C++
Factories: how to pass temporary smart pointers to functions. C++
我有一个 class Foo
class Foo;
工厂返回指向它的指针:
std::unique_ptr<Foo> createFoo();
并且,由于 Herb 告诉我,一个对 Foo 的生命周期没有特殊要求的普通函数应该采用普通的裸指针:
void plainf(Foo* f);
我的客户应该如何正确地执行此操作?
plainF(createFoo());
如果他必须写,他会不高兴的:
auto someName = createFoo();
plainF(someName.get());
您可以使用 get
成员函数,其中 returns 一个指向拥有对象的原始指针。
plainF(createFoo().get());
createFoo()
创建的临时文件在 plainF
完成之前不会超出范围。只要 plainF
不将指针传递到范围之外,这是完全安全的。
如果您不需要 plainF
的参数可以为 null,您还可以更改其签名以通过引用获取参数,允许稍微不那么冗长的语法:
std::unique_ptr<Foo> createFoo();
void plainf(Foo& f);
plainF(*createFoo());
中提及的所有生命周期注意事项均适用,因此使用起来同样安全。
请注意,这意味着 createFoo
永远不会 return 为空 unique_ptr
。因此,如果允许该功能失败,则必须通过其他方式指示该错误,例如。通过抛出异常。
我有一个 class Foo
class Foo;
工厂返回指向它的指针:
std::unique_ptr<Foo> createFoo();
并且,由于 Herb 告诉我,一个对 Foo 的生命周期没有特殊要求的普通函数应该采用普通的裸指针:
void plainf(Foo* f);
我的客户应该如何正确地执行此操作?
plainF(createFoo());
如果他必须写,他会不高兴的:
auto someName = createFoo();
plainF(someName.get());
您可以使用 get
成员函数,其中 returns 一个指向拥有对象的原始指针。
plainF(createFoo().get());
createFoo()
创建的临时文件在 plainF
完成之前不会超出范围。只要 plainF
不将指针传递到范围之外,这是完全安全的。
如果您不需要 plainF
的参数可以为 null,您还可以更改其签名以通过引用获取参数,允许稍微不那么冗长的语法:
std::unique_ptr<Foo> createFoo();
void plainf(Foo& f);
plainF(*createFoo());
请注意,这意味着 createFoo
永远不会 return 为空 unique_ptr
。因此,如果允许该功能失败,则必须通过其他方式指示该错误,例如。通过抛出异常。