C++ C++;11传递nullptr的Setter函数参数

C++ C++;11传递nullptr的Setter函数参数,c++,c++11,parameter-passing,setter,nullptr,C++,C++11,Parameter Passing,Setter,Nullptr,我想知道关于参数传递nullptr的C++11最佳实践。我想通过向已经存在的setter函数传递null ptr来重置类成员对象。举个简单的例子: #include "foo.h" Foo my_foo; void set_foo(std::shared_ptr<Foo> bar){ my_foo = bar; } int main() { set_foo(std::make_shared<Foo>()); //do stuff set_foo(nu

我想知道关于参数传递nullptr的C++11最佳实践。我想通过向已经存在的setter函数传递null ptr来重置类成员对象。举个简单的例子:

#include "foo.h"

Foo my_foo;

void set_foo(std::shared_ptr<Foo> bar){
  my_foo = bar;
}

int main()
{
  set_foo(std::make_shared<Foo>());
  //do stuff
  set_foo(nullptr);
}
#包括“foo.h”
福我福;
无效集\u foo(标准::共享\u ptr条){
my_foo=酒吧;
}
int main()
{
set_foo(std::make_shared());
//做事
set_foo(nullptr);
}
这样行吗?或者,或者是否有更好、更首选的方法来重置我的_foo?我不想仅仅为了重置我的_-foo而使用另一种方法


我正在开发的应用程序的真正动机是,我有一个持久的单例类,它由数量可变的其他类共享。为了便于编码,其他类只需在它们需要的时间内拥有一个指向该单例的共享指针并使用它,然后在不再允许它们访问它时丢弃/设置为null ptr。如果有什么我可能错过或没有想到的,任何建议都非常感谢,谢谢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();
}
我想你可以省去整个
FooWrapper
,只需使用一个全局
共享的

#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
}
#包括“foo.h”
共享\u ptr my \u foo{nullptr};
int main()
{
my_foo.reset(new foo{});//1
my_foo->do_stuff();
my_foo.reset(new foo{});//2
my_foo.reset(nullptr);//清除
}

如您所见,
shared\u ptr
使用该模式将两种不同的功能捆绑到
reset
-方法中。所以,这不可能完全是坏事。

有什么建议吗?摆脱那个单身汉!我认为这是可以接受的,你可以在C++标准库中找到它的例子(例如:代码> STD::unQueEuPPT::ReStE.()/Cuff>)。
#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
}