Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fill vector with constructor call

I have two classes, one derive from the other. I would like to allocate an std:vector which is fill of the derived class. The tricky question is that I want it to call the move constructor written in the base class.

Here is the code:

class Base{
    public:
    size_t size;
    double* buff;

    Base(size_t _size):size(_size){
        buff = new double[size];
    }

    Base() = delete;
    Base operator=(const Base&) = delete;
    Base(const Base&) = delete;

    Base(Base&& b):size(b.size), buff(b.buff){
        b.buff = nullptr;
    }
    Base operator=(Base&& b){
        size = b.size;
        buff = b.buff;
        b.buff = nullptr;
    }
};

class Derive : public Base{
    public:
    Derive(size_t _size):Base(_size){};
    Derive() = delete;
    Derive operator=(const Derive&) = delete;
    Derive(const Derive&) = delete;

    Derive(Derive&& b):Base(move(b)){}
    Derive operator=(Derive&& b){
        Base::operator=(move(b));
    }
};

/********/

vector<Derive> v(10, move(Derive(5)));

g++ is telling me

error: use of deleted function ‘Derive::Derive(const Derive&)’
 { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }

and I don't understand what I am supposed to do.

like image 648
Viridya Avatar asked Jul 10 '26 06:07

Viridya


1 Answers

The problem here is that std::vector(count, object) copies object, count times, into the vector. You cannot move from it since you can only move an object into a single object.

If your class is not copyable then you will not be able to use it. You can however use

std::vector<Type> foo;
foo.reserve(count);
for (int i = 0; i < count; ++i)
    foo.emplace_back(Types_parmeters);
like image 99
NathanOliver Avatar answered Jul 13 '26 19:07

NathanOliver



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!