Я пытаюсь получить класс Smiley от Circle:

struct Smiley : Circle {
  void draw_lines() const;
};

void Smiley::draw_lines() const {
  Circle::draw_lines();   // outline
  /*rest of code here*/
}

Это определение Круга:

struct Circle : Shape {
  Circle(Point p, int rr);    // center and radius

  void draw_lines() const;

  Point center() const;

  void set_radius(int rr) { set_point(0, Point(center().x - rr, center().y - rr)); r = rr; }
  int radius() const { return r; }
private:
  int r;
};

Я в основном хочу Круг с парой дуг, нарисованных сверху. Теоретически мне нужно было написать только draw_lines() (который определяется как virtual в Shape), но он ничего не делает без конструктора, и если у меня есть конструктор, он выдает ошибку и говорит, что У Circle нет конструктора по умолчанию, даже если у меня нет кода в конструкторе, относящемся к Circle.

Кто-нибудь знает, почему я получаю эту ошибку?

c++
0
user2509848 18 Дек 2013 в 22:31

2 ответа

Лучший ответ

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

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

struct Smiley : Circle {
  Smiley(Point p, int rr);
  void draw_lines() const;
};

Smiley::Smiley(Point p, int rr)
   : Circle(p, rr)
{};

Я в основном хочу Круг с парой дуг, нарисованных сверху

Тогда это больше не круг, так почему же Smiley наследует Circle?

2
Lightness Races in Orbit 18 Дек 2013 в 18:37

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

struct Smiley : Circle {
  Smiley(Point p, int rr) : Circle(p, rr)
  {
  } 
  void draw_lines() const;
};
1
Community 23 Май 2017 в 10:33