gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:09:57 26 4
gpt4 key购买 nike

如果我有一个带有私有(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com