使用移动从派生类分配基础数据会产生错误[重复]
Posted
技术标签:
【中文标题】使用移动从派生类分配基础数据会产生错误[重复]【英文标题】:Assigning base data from derived class with move produces an error [duplicate] 【发布时间】:2020-09-07 01:21:33 【问题描述】:我不熟悉 C++ 的新特性,例如移动语义(移动构造函数和移动赋值运算符)。下面的代码在IDE中产生如下错误。
如何解决?
#include <iostream>
using namespace std;
class HeavyData ;
class Base
protected:
HeavyData data;
public:
Base(HeavyData data) :data data
Base(Base const&& src) :data move(src.data)
Base& operator = (Base const&& rhs)
this->data = move(rhs.data);
return *this;
;
class Derived : public Base
private:
HeavyData extra;
public:
Derived(HeavyData data, HeavyData extra) :
extra extra , Base(data)
Derived(Derived const&& src) :
extra move(src.extra) , data move(src.data)
Derived& operator = (Derived const&& rhs)
this->data = move(rhs.data);
this->extra = move(rhs.extra);
return *this;
;
void main()
HeavyData data, extra;
Derived d1(data, extra);
Derived d2 = move(d1);
【问题讨论】:
【参考方案1】:不要在派生类的构造函数中初始化基类数据。首先调用基类构造函数,然后调用派生类的数据。
Derived(Derived const &&src) :
Base(std::move(src)), extrastd::move(src.extra) ()
【讨论】:
对不起,请给我代码。 @WissenMachtFrei 我已经编辑了答案以提供示例代码。 @AdrianMole 非常正确,谢谢。我已经编辑了答案。【参考方案2】:tl;dr;你需要调用基类构造函数。
由于基类应在派生类之前初始化,因此基类成员应在基类构造期间初始化。您不能影响从派生类创建基类成员,但您可以像这样调用基类构造函数:
Derived(Derived const&& src) :
Base(move(src.data)),
extra move(src.extra)
编辑:委托 -> 基类
【讨论】:
@JaMiT 你是完全正确的。我已经编辑了帖子。谢谢!【参考方案3】:你需要:
Derived(Derived const&& src) :
Base(std::move(src.data)),
extra move(src.extra)
【讨论】:
据我了解,基类中受保护的数据成员必须在派生类中可见。 这与data
是protected
无关!您不能使用初始化列表初始化派生类中的基类成员...您必须在构造函数的 body 中进行。
将protected
更改为public
并不能解决问题。我刚试过。
@WissenMachtFrei 是的,修复了它
为什么会这样?仅代码的答案很少能解释任何事情。以上是关于使用移动从派生类分配基础数据会产生错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章