无法初始化类中的unique_ptr向量

Can't initialize a vector of unique_ptr in class

本文关键字:unique ptr 向量 初始化      更新时间:2023-10-16

目前,我有两个类,AiAction

我的类Ai获得一个名为_root的成员Action

class Ai
{
public:
Ai();
~Ai();
private:
Action _root;
};

当我想使用构造函数Ai初始化我的类Action时,就会出现问题。

Ai::Ai() : _root(Action(0, AI, 0, 0)) 
{
}

我的类Action我的构造函数:

class Action
{
public:
Action(int, Availability, int, int);
~Action();
private:
int _y;
int _x;
int _depth;
Availability _type;
vector<unique_ptr<Action>> _child;
};
Action::Action(int depth, Availability type, int y, int x)
{
this->_y = y;
this->_x = x;
this->_depth = depth;
this->_type = type;
}

问题恰恰发生在vector<unique_ptr<Action>> _child;.

当我创建一个对象Ai时,我的构造函数会创建一个具有默认值的对象Action,但它无法初始化unique_ptr的向量。

我的调试器收到此错误:

error: call to implicitly-deleted copy constructor of
'std::__1::unique_ptr<Action, std::__1::default_delete<Action> >'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);

知道吗?

您声明Ai构造函数的方式是创建一个临时Action对象,然后将其复制到_root.

解决方案很简单:

Ai::Ai() : _root(0, AI, 0, 0)

将构造函数参数直接传递给_root

不相关,您不需要使用this->来访问Action::Action中的成员变量。

Action不是用户定义的移动构造函数。它确实有一个用户定义的析构函数,可以防止自动生成移动构造器。Action至少有一个成员(_child(不能复制。因此,Action也没有复制构造函数。

在 C++11 中,仅当Action具有可访问的复制或移动构造函数时,才能执行_root(Action(0, AI, 0, 0))。它两者都没有。要解决这个问题,你可以直接构造_root(参见1201ProgramAlarm的答案(,或者要求编译器通过添加

Action(Action&&) = default;

请参阅此示例以获取 C++11


在 C++17 中,规则发生了变化,由于强制复制/移动省略,_root(Action(0, AI, 0, 0))相当于_root(0, AI, 0, 0)。代码应在没有可用的复制和移动构造函数的情况下进行编译(除非有其他原因导致编译失败(。

请参阅此示例以了解 C++17