C++0x 和 Friend 函数以及 boost::make_shared

标签 c++ c++11 shared-ptr friend make-shared

如果我有一个带有私有(private)构造的类,使用 boost::make_shared() 从该类的成员函数中构造该类的 shared_ptr 将使用 gcc 4.6 发出编译器错误。

#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"

class Foo
{
private:
    Foo(int a){};
public:
    static boost::shared_ptr<Foo> do_foo(){ return boost::make_shared<Foo>(5); }
    friend template boost::shared_ptr<Foo> boost::make_shared<Foo>( Arg1 && arg1, Args && ... args );
}

int main()
{
    auto f = Foo::do_foo();
}

调用 Foo::do_foo 将导致编译器错误。

有什么想法吗?

最佳答案

遗憾的是,在make_shared 中没有指定哪个函数实际调用了构造函数,因此您不能将该函数设为友元。如果你有一个像这样的私有(private)构造函数的类,那么你就不能用 make_shared 构造一个实例。

但是,您可以做的是创建一个派生类,该派生类具有调用适当基类构造函数的公共(public)构造函数,并使该派生类成为 friend (因此它可以调用私有(private)构造函数):

class Foo
{
private:  
    Foo(int a){};  
public:  
    static boost::shared_ptr do_foo();
    friend class DerivedFoo;
};

class DerivedFoo: public Foo
{
public:
    DerivedFoo(int a):
        Foo(a)
    {}
};

boost::shared_ptr<Foo> Foo::do_foo(){ return boost::make_shared<DerivedFoo>(5); }

如果 DerivedFoo 位于定义 do_foo 的 .cpp 文件中的匿名命名空间中,则其他 .cpp 文件中的函数仍然无法构造 Foo,用户将无法判断他们拥有的实际上是一个 DerivedFoo

关于C++0x 和 Friend 函数以及 boost::make_shared,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3672841/

相关文章:

c++ - make_shared 真的比 new 更高效吗?

C++指针管理与局部变量

c++ - pthread_once() 中的竞争条件?

c++ - 在函数指针返回值中转换对指针的引用

c++ - 复制算法与容器构造函数

c++ - 在什么平台上 func(shared_ptr(...), shared_ptr(...)) 真的很危险?

c++ - OS X 上 std::enable_shared_from_this<> 的编译错误

c++ - 将单个字节从 Enum 附加到 NSMutableData

c++ - 如何获得 std::regex 的所有可能匹配项

c++ - 是否存在无法锁定(提升为 shared_ptr)的 weak_ptr 之类的东西?如果不是,为什么?