64,662
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 定义一个“点”类
class Point
{
private:
double x;
double y;
public:
Point()
{
x = 0.0;
y = 0.0;
}
Point(double x, double y)
{
this->x = x;
this->y = y;
}
void set_X(double x)
{
this->x = x;
}
double get_X()
{
return x;
}
void set_Y(double y)
{
this->y = y;
}
double get_Y()
{
return y;
}
};
// 定义几何图形类
class Geometry
{
protected:
vector<Point> points;
public:
virtual double calculateArea() = 0;
virtual ~Geometry(){};
};
// 定义具体的几何图形类:三角形
class Triangle : public Geometry
{
public:
Triangle()
{
points.push_back(Point(0.0, 0.0));
points.push_back(Point(0.0, 0.0));
points.push_back(Point(0.0, 0.0));
}
Triangle(const Point& a, const Point& b, const Point& c)
{
points.push_back(a);
points.push_back(b);
points.push_back(c);
}
double calculateArea()
{
double line1 = sqrt(pow((points[0].get_X() - points[1].get_X()), 2.0) + pow((points[0].get_Y() - points[1].get_Y()), 2.0));
double line2 = sqrt(pow((points[1].get_X() - points[2].get_X()), 2.0) + pow((points[1].get_Y() - points[2].get_Y()), 2.0));
double line3 = sqrt(pow((points[2].get_X() - points[0].get_X()), 2.0) + pow((points[2].get_Y() - points[0].get_Y()), 2.0));
double halfPerimeter = (line1 + line2 + line3) / 2.0;
return sqrt(halfPerimeter * (halfPerimeter - line1) * (halfPerimeter - line2) * (halfPerimeter - line3));
}
};
// 定义具体的几何图形类:四边形
class Quadrangle : public Geometry
{
public:
Quadrangle()
{
points.push_back(Point(0.0, 0.0));
points.push_back(Point(0.0, 0.0));
points.push_back(Point(0.0, 0.0));
points.push_back(Point(0.0, 0.0));
}
Quadrangle(const Point& a, const Point& b, const Point& c, const Point& d)
{
points.push_back(a);
points.push_back(b);
points.push_back(c);
points.push_back(d);
}
double calculateArea()
{
double area = 0;
double line1 = sqrt(pow((points[0].get_X() - points[1].get_X()), 2.0) + pow((points[0].get_Y() - points[1].get_Y()), 2.0));
double line2 = sqrt(pow((points[1].get_X() - points[2].get_X()), 2.0) + pow((points[1].get_Y() - points[2].get_Y()), 2.0));
double line3 = sqrt(pow((points[2].get_X() - points[3].get_X()), 2.0) + pow((points[2].get_Y() - points[3].get_Y()), 2.0));
double line4 = sqrt(pow((points[3].get_X() - points[0].get_X()), 2.0) + pow((points[3].get_Y() - points[0].get_Y()), 2.0));
double diagonal = sqrt(pow((points[0].get_X() - points[2].get_X()), 2.0) + pow((points[0].get_Y() - points[2].get_Y()), 2.0));
double halfPerimeter = (line1 + line2 + diagonal) / 2.0;
area += sqrt(halfPerimeter * (halfPerimeter - line1) * (halfPerimeter - line2) * (halfPerimeter - diagonal));
halfPerimeter = (line3 + line4 + diagonal) / 2.0;
area += sqrt(halfPerimeter * (halfPerimeter - line3) * (halfPerimeter - line4) * (halfPerimeter - diagonal));
return area;
}
};
// 定义抽象工厂类
class AbstractGeometryFactory
{
protected:
Geometry* geometry;
public:
virtual Geometry* createGeometry(const vector<Point>& points) = 0;
virtual ~AbstractGeometryFactory(){}
};
// 定义具体的工厂类:三角形工厂,用于创建三角形
class TriangleFactory : public AbstractGeometryFactory
{
public:
TriangleFactory()
{
geometry = NULL;
}
Geometry* createGeometry(const vector<Point>& points)
{
if(points.size() != 3)
{
cout << "It's not a triangle" << endl;
}
geometry = new Triangle(points[0], points[1], points[2]);
return geometry;
}
~TriangleFactory()
{
if(geometry != NULL)
{
delete geometry;
geometry = NULL;
}
}
};
// 定义具体的工厂类:四边形工厂,用于创建四边形
class QuadrangleFactory : public AbstractGeometryFactory
{
public:
Geometry* createGeometry(const vector<Point>& points)
{
if(points.size() != 4)
{
cout << "It's not a Quadrangle" << endl;
}
geometry = new Quadrangle(points[0], points[1], points[2], points[3]);
return geometry;
}
~QuadrangleFactory()
{
if(geometry != NULL)
{
delete geometry;
geometry = NULL;
}
}
};
// 程序入口:用于测试上面的代码
int main(int argc, char** argv)
{
AbstractGeometryFactory* agf1;
AbstractGeometryFactory* agf2;
vector<Point> trianglePoints;
vector<Point> quadranglePoints;
Point a(0.0, 0.0);
Point b(6.0, 0.0);
Point c(6.0, 6.0);
Point d(0.0, 6.0);
trianglePoints.push_back(a);
trianglePoints.push_back(b);
trianglePoints.push_back(c);
quadranglePoints.push_back(a);
quadranglePoints.push_back(b);
quadranglePoints.push_back(c);
quadranglePoints.push_back(d);
agf1 = new TriangleFactory;
agf2 = new QuadrangleFactory;
double triangleArea = (agf1->createGeometry(trianglePoints))->calculateArea();
cout << "The area of the triangle is:\t" << triangleArea << endl;
double quadrangleArea = (agf2->createGeometry(quadranglePoints))->calculateArea();
cout << "The area of the quadrangle is:\t" << quadrangleArea << endl;
delete agf1;
delete agf2;
return 0;
}