我正在编写一个使用 C 接口创建的两个对象的类。对象看起来像:
typedef struct... foo_t;
foo_t* create_foo(int, double, whatever );
void delete_foo(foo_t* );
(对于 类似bar_t
)。因为 C++11,我想将它们包装在一个智能指针中,这样我就不必编写任何特殊方法。该类将拥有两个对象的唯一所有权,因此在unique_ptr
逻辑上是有意义的......但我仍然需要编写一个构造函数:
template <typename T>
using unique_ptr_deleter = std::unique_ptr<T, void(*)(T*)>;
struct MyClass {
unique_ptr_deleter<foo_t> foo_;
unique_ptr_deleter<bar_t> bar_;
MyClass()
: foo_{nullptr, delete_foo}
, bar_{nullptr, delete_bar}
{ }
~MyClass() = default;
void create(int x, double y, whatever z) {
foo_.reset(create_foo(x, y, z));
bar_.reset(create_bar(x, y, z));
};
另一方面,使用shared_ptr
,我不必编写构造函数或使用类型别名,因为我可以delete_foo
传入reset()
- 尽管这会使我的可MyClass
复制并且我不想要那样。
MyClass
使用unique_ptr
语义编写并仍然遵守零规则的正确方法是什么?