目前,我有两个类,Ai
和Action
。
我的类Ai
获得一个名为_root
的成员Action
。
class Ai
{
public:
Ai();
~Ai();
private:
Action _root;
};
当我想用构造函数Action
初始化类Ai
时,问题就会发生。
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)...);
有什么想法吗?
发布于 2019-11-30 11:37:51
按照声明Ai
构造函数的方式,您将创建一个临时Action
对象,然后将其复制到_root
中。
解决办法很简单:
Ai::Ai() : _root(0, AI, 0, 0)
直接将构造函数参数传递给_root
。
不相关,您不需要使用this->
访问Action::Action
中的成员变量。
发布于 2019-11-30 12:08:16
类Action
不是用户定义的移动构造函数。它确实有一个用户定义的析构函数来阻止移动构造器的自动生成。Action
至少有一个不能复制的成员(_child
)。因此,Action
也没有复制构造函数。
在C++11中,只有当Action
具有可访问性、复制或移动构造函数时,才能执行_root(Action(0, AI, 0, 0))
。两者都没有。要解决这个问题,您可以直接构造1201ProgramAlarm's (请参阅_root
答案),或者通过添加
Action(Action&&) = default;
参见此示例 for C++11
在C++17中,规则已经更改,而_root(Action(0, AI, 0, 0))
由于强制复制/移动省略而等同于_root(0, AI, 0, 0)
。代码应该在没有复制和移动构造函数可用的情况下进行编译(除非有其他原因导致编译失败)。
参见此示例 for C++17
https://stackoverflow.com/questions/59119541
复制