我正在尝试创建一个继承第一个的Polygon类和一个Rectangle和Triangle。 Polygon类有高度和宽度变量,我希望它们在构造函数中给定值。然后,矩形和三角形具有面积计算方法。然后,我使用main()给出一些例子。我用:
#include <iostream>
using namespace std;
class Polygon {
public:
Polygon(int, int);
protected:
int height;
int width;
};
class Rectangle: public Polygon {
public:
void calc_area();
};
class Triangle: public Polygon {
public:
void calc_area();
};
Polygon::Polygon(int a, int b) {
height = a;
width = b;
}
void Rectangle::calc_area() {
cout << "Rectangle area: " << (height*width) << endl;
}
void Triangle::calc_area() {
cout << "Triangle area: " << (height*width/2) << endl;
}
int main() {
Rectangle s1(5, 2);
Triangle s2(5, 2);
s1.calc_area();
s2.calc_area();
}
但是,虽然我的新手眼睛看起来都很好,但我得到了一系列错误:
12 base Polygon',类中只有非默认构造函数,没有构造函数`
36没有匹配函数来调用`Rectangle :: Rectangle(int,int)
37没有匹配函数来调用`Triangle :: Triangle(int,int)'
有人可以给我一些提示吗?如上所示,我对C ++很新...
答案 0 :(得分:2)
您不应该调用构造函数来使用.
,例如:
Rectangle s1;
Triangle s2;
s1.Polygon(5, 2);
s2.Polygon(5, 2);
尝试这种方式:
Rectangle s1(5, 2);
Triangle s2(5, 2);
您应该分别为Rectangle
和Triangle
添加构造函数:
class Rectangle: public Polygon {
public:
Rectangle(int height, int width):Polygon(height, width){}
void calc_area();
};
class Triangle: public Polygon {
public:
Triangle(int height, int width):Polygon(height, width){}
void calc_area();
};
答案 1 :(得分:0)
要构建Triangle
和Rectangle
,您正在调用它们不可见的默认构造函数。
所以Triangle()
和Rectangle()
方法。这些实现为空方法,但它们还必须调用它们继承的任何类的默认构造函数。实际上,这就是生成的代码:
Triangle() : Polygon() {}
Rectangle() : Polygon() {}
Polygon
将不会获得默认构造函数,因为您创建了自己的构造函数。因此,获得回报的唯一方法是定义它:
Polygon() {}
或者在C ++ 11中:
Polygon() = default;
实例化成员变量时会调用默认构造函数Triangle()
或Rectangle()
。所以这些行调用构造函数:
Rectangle s1;
Triangle s2;
请注意,构建它们后,无法重建。所以这些电话是非法的:
s1.Polygon(5, 2);
s2.Polygon(5, 2);
现在,如果你想完成一个设置构造函数,可以这样做,但是你需要为Triangle
和Rectangle
定义它:< / p>
Triangle(int width, int height) : Polygon(width, height) {}
Triangle(int width, int height) : Polygon(width, height) {}
再次回想一下,定义这些方法将导致不为Triangle
或Rectangle
生成默认构造函数。因此,您的s1
和s2
声明现在将是非法的,但这样做是正确的,因为您无论如何都希望用新的构造函数声明它们:
Rectangle s1(5, 2);
Triangle s2(5, 2);
答案 2 :(得分:0)
你必须用这种方式......
Rectangle *s1 = new Rectangle;
s1->ab(5,2);
s1->calc_area();