使用移动从派生类分配基础数据会产生错误[重复]

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) 

【讨论】:

据我了解,基类中受保护的数据成员必须在派生类中可见。 这与dataprotected 无关!您不能使用初始化列表初始化派生类中的基类成员...您必须在构造函数的 body 中进行。 protected 更改为public 并不能解决问题。我刚试过。 @WissenMachtFrei 是的,修复了它 为什么会这样?仅代码的答案很少能解释任何事情。

以上是关于使用移动从派生类分配基础数据会产生错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类型将基础对象转换为派生对象

在 C++ 中快速将基础对象的所有成员分配给派生对象

C ++如何使用派生对象中的独立基础对象

根据条件将不同的派生类分配给基类[重复]

c++:-4

《C#零基础入门之百识百例》(五十四)派生类的介绍和使用 -- 等差数列