提问人:Hossam Elsamanoudy 提问时间:7/22/2022 最后编辑:wohlstadHossam Elsamanoudy 更新时间:8/12/2022 访问量:395
无法从友元类访问私有构造函数 [duplicate]
Can't access private constructor from a friend class [duplicate]
问:
在以下代码片段中,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;
}
答:
3赞
wohlstad
7/22/2022
#1
问题在于,应该构造 的实例不是 的友元。因此,它无权访问 的私有构造函数。make_unique
B
B
B
您可以使用以下方法来实现类似的目标:
std::unique_ptr<B> pB2 = std::unique_ptr<B>(new B("dummy3"));
一般来说,建议更喜欢给自己打电话,我不鼓励以任何方式这样做(见这里:std::make_unique 和 std::unique_ptr 与 new 之间的区别)。
但是,如果您被束缚在这种特定的阶级等级制度中,它将解决您的问题。make_unique
new
2赞
user12002570
7/22/2022
#2
问题是内部使用私有构造函数。但是由于它自己不是 的朋友,我们得到了提到的错误。make_unique
B::B(const std::string& )
make_unique
A
要解决此问题,您可以摆脱并直接使用 如图所示,或者制作 ctor .make_unique
unique_ptr
new
public
上一个:只允许“好友”类访问某些私人成员
下一个:同一命名空间中的友元类
评论
std::make_unique
A
B