这次作业本来没什么难的,但是中间卡在了虚继承上,浪费了不少时间。
题面如下:
We know that the triangle can be classified according to the classification angle or side.
Clearly, the right triangle is a triangle, isosceles triangle is a triangle.
Isosceles right triangle is both a isosceles triangle and a right triangle.
Each triangle has three sides and can calculate its area
There are four classes Triangle, IsoscelesTriangle, RightTriangle and IsoscelesRightTriangle.
Both class IsoscelesTriangle and class RightTriangle inherits class Triangle.
Class IsoscelesRightTriangle inherits class IsoscelesTriangle and class RightTriangle.
All classes have the similar functions.
The base class Triangle is:
You should implement all the four classes.
中文题面:
我们知道三角形可以按照角度或者边长分类。
显然,直角三角形是三角形,等腰三角形是三角形,等腰直角三角形既是直角三角形也是等腰三角形。每个三角形都有三条边,可以计算面积。
现在有四个类:
class Triangle 三角形
class IsoscelesTriangle 等腰三角形
class RightTriangle 直角三角形
class IsoscelesRightTriangle 等腰直角三角形
class IsoscelesTriangle 和 class RightTriangle 继承 class Triangle,class IsoscelesRightTriangle 继承 class IsoscelesTriangle 和 class RightTriangle
类都有以下函数:
1.构造函数 输出Construct+类的名字,换行 例如“Construct Triangle\n”
2.void set(int aa, int bb, int cc) 设置三角形的三条边长
3.double area() 计算三角形面积,如果不是三角形,返回值为0
4.void check() 检查三边是否符合类名表示的三角形的要求
5.void print() 根据类名输出,如果符合类名表示的三角形,则输出“It is ”+ 类名 + “ 0-0\n”;如果不符合则输出“It is not ”+ 类名 + “ =-=\n”
代码如下:
main.cpp
#include <iostream>
#include <cmath>
#include "Triangle.h"
using std::cin;
using std::cout;
using std::endl;
int main() {
int a, b, c;
cin >> a >> b >> c;
Triangle t;
IsoscelesTriangle i;
RightTriangle r;
IsoscelesRightTriangle ir;
Triangle* tri = &t;
Triangle* iso = &i;
Triangle* rig = &r;
Triangle* ist = &ir;
tri -> set(a, b, c);
iso -> set(a, b, c);
rig -> set(a, b, c);
ist -> set(a, b, c);
cout << tri -> area() << endl;
tri -> print();
iso -> print();
rig -> print();
ist -> print();
return 0;
}
Triangle.h
#ifndef TRIANGLE_H
#define TRIANGLE_H
class Triangle {
public:
Triangle();
virtual void set(int aa, int bb, int cc);
double area() const;
virtual bool check() const;
virtual void print() const;
protected:
int a, b, c;
};
class IsoscelesTriangle : virtual public Triangle {
public:
IsoscelesTriangle();
virtual void set(int aa, int bb, int cc);
virtual bool check() const;
virtual void print() const;
private:
int a, b, c;
};
class RightTriangle : virtual public Triangle { // 之前的错误是因为漏打了virtual
public:
RightTriangle();
virtual void set(int aa, int bb, int cc);
virtual bool check() const;
virtual void print() const;
private:
int a, b, c;
};
class IsoscelesRightTriangle : public IsoscelesTriangle, public RightTriangle {
public:
IsoscelesRightTriangle();
virtual void set(int aa, int bb, int cc);
virtual bool check() const;
virtual void print() const;
private:
int a, b, c;
};
#endif
#include <iostream>
#include <cmath>
#include "Triangle.h"
using namespace std;
Triangle::Triangle() {
cout << "Construct Triangle\n";
}
void Triangle::set(int aa, int bb, int cc) {
a = aa;
b = bb;
c = cc;
}
bool Triangle::check() const {
if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
return true;
} else {
return false;
}
}
double Triangle::area() const {
double area, p, aa, bb, cc;
if (this->check()) {
aa = static_cast<double>(a);
bb = static_cast<double>(b);
cc = static_cast<double>(c);
p = (a + b + c)/2.0;
area = sqrt(p*(p-aa)*(p-bb)*(p-cc));
return area;
} else {
return 0;
}
}
void Triangle::print() const {
if (this->check())
cout << "It is Triangle 0-0\n";
else
cout << "It is not Triangle =-=\n";
}
IsoscelesTriangle::IsoscelesTriangle() : Triangle() {
cout << "Construct IsoscelesTriangle\n";
a = b = c = 0;
}
void IsoscelesTriangle::set(int aa, int bb, int cc) {
a = aa;
b = bb;
c = cc;
}
bool IsoscelesTriangle::check() const {
if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
if ((a == b)||(a == c)||(b == c))
return true;
else
return false;
} else {
return false;
}
}
void IsoscelesTriangle::print() const {
if (this->check())
cout << "It is IsoscelesTriangle 0-0\n";
else
cout << "It is not IsoscelesTriangle =-=\n";
}
RightTriangle::RightTriangle() : Triangle() {
cout << "Construct RightTriangle\n";
a = b = c = 0;
}
void RightTriangle::set(int aa, int bb, int cc) {
a = aa;
b = bb;
c = cc;
}
bool RightTriangle::check() const {
if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
if ((a*a + c*c == b*b)||(a*a + b*b == c*c)||(b*b + c*c == a*a))
return true;
else
return false;
} else {
return false;
}
}
void RightTriangle::print() const {
if (this->check())
cout << "It is RightTriangle 0-0\n";
else
cout << "It is not RightTriangle =-=\n";
}
IsoscelesRightTriangle::IsoscelesRightTriangle() : Triangle(), RightTriangle(),
IsoscelesTriangle() {
cout << "Construct IsoscelesRightTriangle\n";
a = b = c = 0;
}
void IsoscelesRightTriangle::set(int aa, int bb, int cc) {
a = aa;
b = bb;
c = cc;
}
bool IsoscelesRightTriangle::check() const {
if (a+b > c && b+c > a && c+a > b && a > 0 && b > 0 && c > 0) {
if ((IsoscelesTriangle::check()) && (RightTriangle::check()))
return true;
else
return false;
} else {
return false;
}
}
void IsoscelesRightTriangle::print() const {
if (this->check())
cout << "It is IsoscelesRightTriangle 0-0\n";
else
cout << "It is not IsoscelesRightTriangle =-=\n";
}