我有以下课程:具有删除副本构造函数的A类。
class A
{
public:
explicit A(int i_a) {a = i_a;};
~A(){};
private:
A(const A&) = delete;
A& operator=(const A&) = delete;
int a;
};
Run Code Online (Sandbox Code Playgroud)
B类以及一个unique_ptr成员。
class A;
class B
{
public:
B(int i_b);
~B() {};
private:
std::unique_ptr<A> p_b;
};
Run Code Online (Sandbox Code Playgroud)
和B.cpp:
B::B(int i_b)
{
p_b = std::make_unique<A>(A(i_b));
}
Run Code Online (Sandbox Code Playgroud)
我在制作A类的unique_ptr时收到此错误:
'A :: A':无法访问在类'A'中声明的私有成员
有人可以向我解释为什么我会收到此错误吗?我知道通过注释此行“ A(const A&)= delete;” 错误将得到解决。但是我正在寻找一些解释。
p_b = std::make_unique<A>(A(i_b));
Run Code Online (Sandbox Code Playgroud)
在此行中,您尝试调用具有deleted的副本构造函数(或移动未声明的构造函数)
相反,您应该使用:
p_b = std::make_unique<A>(i_b);
Run Code Online (Sandbox Code Playgroud)
或者,您可以为类声明move构造函数:
class A
{
public:
explicit A(int i_a) {a = i_a;};
A(A&&) = default;
A& operator=(A&&) = default;
~A(){};
private:
A(const A&) = delete;
A& operator=(const A&) = delete;
int a;
};
Run Code Online (Sandbox Code Playgroud)
std::make_unique将调用给定类的构造函数,并按原样传递已接收的任何参数。因此,如果您传递一个类型的对象A,它将尝试使用带有类型参数的A构造函数-即复制构造函数或移动构造函数。
因为您已经声明了复制构造函数,所以移动构造函数不会自动生成,因此它不能被使用std::make_unique