-1

I am new to the new feature of C++ such as moving semantic (moving constructor and moving assignment operator). The code below produces an error in IDE as follows.

enter image description here

How to fix it?

#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);
}
Second Person Shooter
  • 14,188
  • 21
  • 90
  • 165

3 Answers3

3

Don't initialize base-class data in the derived class's constructor. Invoke the base class constructor first, then your derived class's data.

Derived(Derived const &&src) :
  Base(std::move(src)), extra{std::move(src.extra)} ()
jkb
  • 2,376
  • 1
  • 9
  • 12
2

tl;dr;You need to call base class constructor.

Since base class should be initialized before derived class, base class members should be initialized during base class constuction. You cannot affect base class members creation from the derived class, but you can call base class constructor like this:

 Derived(Derived const&& src) :
        Base(move(src.data)),
        extra{ move(src.extra) }{}

Edit: delegating -> base class

olkivan
  • 89
  • 1
  • 3
0

You need:

Derived(Derived const&& src) : 
    Base(std::move(src.data)), 
    extra{ move(src.extra) }
{}
artm
  • 17,291
  • 6
  • 38
  • 54