Как определить конструктор копирования и переопределение оператора = в классе с указателями на объект класса? - PullRequest
2 голосов
/ 31 марта 2011

Я слышал, что когда в классе есть указатель, всегда должен быть конструктор копирования и переопределение оператора = в C ++. Я искал об этом и не нашел объяснения о том, когда указатель указывает на объект класса.

Чтобы проиллюстрировать мою проблему:

class Figure
{
    Figure();
    Figure(const Figure& figure)
    Figure(float density);
    ~Figure();
    virtual float volume()=0;

    Figure *next;

protected:
    float density;
};

class Sphere: public Figure
{
    Sphere();
    Sphere(float r);
    Sphere(float r, float density);
    ~Sphere();
    float volume();

private:
    float r;
};

Я попытался сделать конструктор копирования для класса Figure. В последней строке я получаю сообщение об ошибке «объект типа абстрактного класса Рисунок запрещен». Я не знаю, что я делаю не так. И я не знаю, как сделать переопределение оператора присваивания.

Figure::Figure(const Figure& figure)
{
    this->tip = figure.tip;
    this->density = figure.density;
    if (figure.next)
        next = new Figure(*figure.next);
}

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Типичное решение для этого - сделать необходимую операцию абстрактной и поддерживать ее в подклассах.

class Figure {

  virtual Figure * clone() const = 0;
};


class Sphere : public Figure {

  Figure * clone() const {
    return new Sphere(*this);
  }
};

Затем, конечно, правильно реализовать конструктор копирования Sphere.

1 голос
/ 31 марта 2011

Вместо этого поместите конструктор копирования в Сферу.Вы пытаетесь создать класс типа Figure напрямую, и это не сработает, поскольку Figure является абстрактным.

0 голосов
/ 31 марта 2011

Но согласно вашему коду Figure не имеет элемента данных с именем next, только Sphere имеет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...