无法在类中初始化unique_ptr的向量

时间:2019-11-30 19:32:29

标签: c++ class pointers vector initialization

目前,我有AiAction这两个类。

我的班级Ai获得了一个名为Action的成员_root

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)...);

有什么主意吗?

2 个答案:

答案 0 :(得分:4)

以声明Ai构造函数的方式,您正在创建临时 Action对象,然后将其复制到_root

解决方案很简单:

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

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

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

答案 1 :(得分:0)

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

在C ++ 11中,只有在_root(Action(0, AI, 0, 0))可以访问复制或移动构造函数的情况下,才能执行Action。它既没有。要解决此问题,您可以直接构造_root(请参见 1201ProgramAlarm 的答案),或要求编译器通过添加

为您生成move构造函数
Action(Action&&) = default;

See this example for C ++ 11


在C ++ 17中,规则已更改,由于mandatory copy/move elision_root(Action(0, AI, 0, 0))等效于_root(0, AI, 0, 0)。该代码应在没有复制和移动构造函数的情况下进行编译(除非有其他导致编译失败的原因)。

See this example for C ++ 17