【发布时间】:2021-07-14 15:43:04
【问题描述】:
我正在尝试编写两个类 FooFactory 和 Foo。 FooFactory 在构造函数中初始化一个对象 ToolBox 并将其存储在 unique_ptr 中,因为我希望在工厂被破坏后对其进行清理。 Foo 的所有实例都应该能够使用 ToolBox,因此我在 Foo 的构造函数中将 ptr 传递给 ToolBox 对象并将其存储为裸 ptr。
我是 C++ 开发的新手,所以,我的问题是根据我听到的一般建议提出的:
尽可能避免使用原始指针
- 在这种情况下,是否可以使用裸 ptr 来存储 Foo 不拥有的 tool_box 对象?或者我可以使用 smart_ptr 做得更好吗?
- 将 ptr 从 FooFactory 类传递到 ToolBox 到每个新对象的模式是正确的还是我可以做的更好?
我的类的伪代码:
class FooFactory {
public:
FooFactory() {
tool_box_.reset(new ToolBox());
}
std::unique_ptr<Foo> NewFoo() {
std::unique_ptr<Foo> foo(new Foo(tool_box_.get());
return foo;
}
std::unique_ptr<ToolBox> tool_box_;
}
class Foo {
public:
Foo(ToolBox* tool_box) {
tool_box_ = tool_box;
}
private:
// Not Owned
ToolBox* tool_box;
}
【问题讨论】:
-
原始指针,正如您在代码 sn-p 中所拥有的,适用于非拥有指针。 NewFoo 应该是:
std::unique_ptr<ToolBox> NewFoo() {...,因为它返回一个 owned 指针。 -
通常建议是“避免拥有原始指针”。非拥有的原始指针通常没问题。
标签: c++ pointers smart-pointers