Правильный ли конструктор копирования?
У меня есть класс с вектором комплексных чисел. Я хочу сделать для него конструктор перемещения. По моей логике, сначала я должен из другого объекта который мы перемещаем скопировать все данные, а потом удалить все. Как удалить все значения вектора я знаю, а как превратить его в nullptr не уверен. Правильно ли я все делаю?
#include <iostream>
#include<complex>
#include<ostream>
#include<vector>
#include<algorithm>
using namespace std::complex_literals;
class CComplexVector
{
public:
CComplexVector() {} //default
CComplexVector(size_t _size)
{
vector.resize(_size);
}
CComplexVector(CComplexVector& other)
{
vector.resize(other.vector.size());
for (size_t i = 0; i < vector.size(); ++i)
{
vector[i] = other.vector[i];
}
}
CComplexVector(CComplexVector&& other) noexcept
{
vector.resize(other.vector.size());
for (size_t i = 0; i < vector.size(); ++i)
{
vector[i] = other.vector[i];
}
other.vector.~vector();
}
private:
std::vector<std::complex<float>> vector;
};
int main()
{
return 0;
}
Ответы (1 шт):
Первое правило написания копирующего/перемещающего конструктора и т. п. - вообще не писать их, если возможно.
Для вашего класса компилятор сгенерирует и тот и другой автоматически, руками их писать не надо.
Сгенерированные конструкторы будут примерно такие:
CComplexVector(const CComplexVector &other) : vector(other.vector) {}
CComplexVector(CComplexVector &&other) noexcept : vector(std::move(other.vector)) {}
И плюс будут операторы присваивания в духе:
CComplexVector &operator=(const CComplexVector &other) {vector = other.vector; return *this;}
CComplexVector &operator=(CComplexVector &&other) noexcept {vector = std::move(other.vector); return *this;}
Тут нет никакой магии, она вся в std::vector.