Пустые конструктор и деструктор

Есть два вопроса по одному проекту.

Пишу шахматы на С++ и использую Qt. Для каждый фигуры сделал свой класс и унаследовал это все от своего класса figure. Переменные класса figure не создаю, создаю переменные наследованных классов (pawn, king и прочее) и добавляю их в вектор vector.

  1. Преподаватель в вузе увидел код, в котором в классе figure объявлены пустые конструктор и деструктор и попросил ответить на вопрос, почему так делать нельзя, самостоятельно не нашел ответа и взываю к вашей помощи.

  2. Когда к вектору vector white пытаюсь применить:

    white.erase(white.begin() + 1)

выдает 2 ошибки:

  1. use of deleted function 'figure& figure::operator=(const figure&)'
  2. use of deleted function 'QObject& QObject::operator=(const QObject&)'

Вот файл Figure.h

#ifndef FIGURE_H
#define FIGURE_H
#include <QObject>
#include <QVector>

using namespace std;

class figure : public QObject
{
    Q_OBJECT

public:
    figure();
    int x;
    int y;
    bool alive;
    bool active;
    bool castling = true;
    figure (const figure &other);
    figure& operator=(const figure &other);
    ~figure();

Figure.cpp

#include "figure.h"


figure::figure()
{
    
}

figure::figure(const figure &other)
{
    this->x = other.x;
    this->y = other.y;
    this->alive = other.alive;
    this->active = other.active;
    this->castling = other.castling;
}

figure operator = (const figure &other)
{
    if (this != &other)
    {
      this->x = other.x;
      this->y = other.y;
      this->alive = other.alive;
      this->active = other.active;
      this->castling = other.castling;
    }
    return *this;
}

figure::~figure()
{
}

Ответы (1 шт):

Автор решения: KoVadim

Скорее всего, преподавателю не понравилось то, что Вы нарушили правило 3/5

Кратко в Вашем случае оно звучит так - если написал конструктор копирования, то и парный оператор присваивания должен быть написан. Собственно компилятор на это и ругается.

По поводу пустого конструктора - а зачем его писать, если Вам подходит конструктор по умолчанию? То же самое и с деструктором.

Но лучше применить правило нуля - Ваш конструктор тривиален и очевиден. Компилятор может и сам его сгенерировать. Так что можно убрать и в этом случае компилятор сгенерирует и оператор присваивания. И все будет работать.

Оператор перемещения должен выглядеть где то так

в объявлении класса

figure& operator=(figure other)

в с++ файле

figure& figure::operator=(figure other)
{
    std::swap(x, other.x);
    std::swap(y, other.y);
    // тут другие переменны
    return *this;
}

или так (тут аналогично как примере выше. или прям в хедере в объявлении класса вставляйте)

figure& operator=(const figure& other)
{
    if (this != &other) {
      this->x = other.x;
      this->y = other.y;
      this->alive = other.alive;
      this->active = other.active;
      this->castling = other.castling;
    }
    return *this;
}

или можно пойти дальше, и написать вот так

figure (const figure &other) = default;
figure& operator=(const figure& other) = default;
→ Ссылка