我试图从Circle派生出一个名为Smiley的课程:
struct Smiley : Circle {
void draw_lines() const;
};
void Smiley::draw_lines() const {
Circle::draw_lines(); // outline
/*rest of code here*/
}
这是Circle的定义:
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()
(在Shape中定义为virtual
),但如果没有构造函数,它什么也不做,如果我有一个构造函数,它会得到一个错误并说Circle没有可用的默认构造函数,即使构造函数中没有与Circle相关的代码。
有谁知道我收到此错误的原因?
答案 0 :(得分:2)
当您从没有默认构造函数的类继承时,您必须确保调用非默认构造函数。
否则,派生类尝试调用该不存在的默认构造函数,如错误所示。在这种情况下,您可以直接传递相同的参数。
struct Smiley : Circle {
Smiley(Point p, int rr);
void draw_lines() const;
};
Smiley::Smiley(Point p, int rr)
: Circle(p, rr)
{};
我基本上想要一个在顶部绘制几个弧的圆圈
那么它不再是一个圆圈了,为什么Smiley
会继承Circle
?
答案 1 :(得分:1)
您已为圆圈定义了一个需要Point和Radius的构造函数。您应该为Smiley
定义一个具有相同参数的参数,它通过Member Initialiser List使用这些参数调用基类构造函数。
struct Smiley : Circle {
Smiley(Point p, int rr) : Circle(p, rr)
{
}
void draw_lines() const;
};