虽然您可以在 C++ 中使用许多不同的范例,但您可以使用方法将数据和操作捆绑在一起吗?
但是您可能不想更改Foo
界面,所以我猜您想实现类似Singleton 模式的东西,并具有用于销毁它的附加功能?
在这种情况下,我更喜欢两种不同的功能。当您有两个具有不同名称的函数时,这是“使界面易于正确使用而难以正确使用”的更好方法(原文如此。参见 Scott Meyers)。如果你在一个不符合其名称的函数中隐藏了一个功能,那么从这个意义上说,它会变得“困难”。
这将转化为
#include "foo.h"
Foo my_foo;
void set_foo(std::shared_ptr<Foo> bar){
my_foo = bar;
}
void clear_foo(){
my_foo = nullptr;
}
int main()
{
Foo foo.set(std::make_shared<Foo>());
//do stuff
clear_foo();
}
...虽然我不太清楚你分配shared_ptr<Foo>
给Foo
with operator
in是什么意思set_foo
,但我只是在这里使用了你的代码。
使用可以处理您的设置和清除功能的包装器会更舒服。从这里开始,我什至会使用Resource Acquisition Is Initialization (RAII),你可以在这里介绍它(仅草图):
#include "foo.h"
struct FooWrapper {
shared_ptr<Foo> bar_;
FooWrapper() : bar_(nullptr) {}
FooWrapper(shared_ptr<Foo> bar) : bar_(bar) {}
void set(shared_ptr bar<Foo> bar) { bar_ = bar; }
void clear() { bar = nullptr; }
Foo* operator->() { return bar_.get(); }
};
FooWrapper my_foo{};
int main()
{
my_foo.set(std::make_shared<Foo>()); // 1
my_foo->do_stuff();
my_foo.clear(); // clear
my_foo.set(std::make_shared<Foo>()); // 2
} // forgot to clear, doesn't matter FooWrapper takes care of that.
我想你可以省略整个FooWrapper
,而只使用 a global shared_ptr<Foo> foo
。
#include "foo.h"
shared_ptr<Foo> my_foo{nullptr};
int main()
{
my_foo.reset( new Foo{} ); // 1
my_foo->do_stuff();
my_foo.reset( new Foo{} ); // 2
my_foo.reset(nullptr); // clear
}
如您所见,shared_ptr
使用该模式将两个不同的功能捆绑到reset
- 方法中。所以,它不可能是完全坏的。