无法从友元类访问私有构造函数 [duplicate]

Can't access private constructor from a friend class [duplicate]

提问人:Hossam Elsamanoudy 提问时间:7/22/2022 最后编辑:wohlstadHossam Elsamanoudy 更新时间:8/12/2022 访问量:395

问:

在以下代码片段中,g++ 编译器输出以下错误:

错误:“B::B(const string&)”在此上下文中是私有的 857 |
{ return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...));

注释掉使用智能指针的行似乎有效。但是,我不确定为什么它适用于其他情况,并且仍然不适用于智能指针情况。

#include <memory>
#include <iostream>
#include "string"

class A;

class B
{
    friend class A;
    B(const std::string& dummyString) { std::cout << dummyString << std::endl; }
};

class A
{
public:
    A()
    {
        B b("dummy1");
        B* pB1 = new B("dummy2");
        std::unique_ptr<B> pB2 = std::make_unique<B>("dummy3");
    }
};

int main()
{
    A a;
}
C++ 友类 私有构造函数

评论

4赞 UnholySheep 7/22/2022
因为不是 的成员,因此不是 的朋友std::make_uniqueAB

答:

3赞 wohlstad 7/22/2022 #1

问题在于,应该构造 的实例不是 的友元。因此,它权访问 的私有构造函数。make_uniqueBBB

您可以使用以下方法来实现类似的目标:

std::unique_ptr<B> pB2 = std::unique_ptr<B>(new B("dummy3"));

一般来说,建议更喜欢给自己打电话,我不鼓励以任何方式这样做(见这里:std::make_unique 和 std::unique_ptr 与 new 之间的区别)。
但是,如果您被束缚在这种特定的阶级等级制度中,它将解决您的问题。
make_uniquenew

2赞 user12002570 7/22/2022 #2

问题是内部使用私有构造函数。但是由于它自己不是 的朋友,我们得到了提到的错误。make_uniqueB::B(const std::string& )make_uniqueA

要解决此问题,您可以摆脱并直接使用 如图所示,或者制作 ctor .make_uniqueunique_ptrnewpublic