1. 引言
在C++面向对象编程中,类的设计是核心基础。本文将通过一个完整的示例,展示如何设计Point(点)、Line(线段)、Rectangle(长方形)和Circle(圆)四个类,并实现它们的基本功能。这些类之间存在组合关系,体现了面向对象编程的封装、组合和代码复用思想。
2. Point类设计
Point类表示二维平面上的一个点,包含x和y坐标。这是所有其他几何图形的基础。
// 坐标点类 class Pointer { private: double xpos; // x坐标 double ypos; // y坐标 public: // 带默认形参0的设置函数 void setX(double x = 0) { xpos = x; } void setY(double y = 0) { ypos = y; } // const只读成员函数,获取坐标 double getX() const { return xpos; } double getY() const { return ypos; } };设计要点:
- 使用
private封装坐标数据,确保数据安全 - 设置函数带默认参数,方便使用
- 获取函数声明为
const,保证不修改对象状态
3. Line类设计
Line类表示一条线段,由两个Point对象组成(组合关系)。
// 线段类:包含两个Point成员(组合:Line由两个Point组成) class Line { private: Pointer a; // 起点 Pointer b; // 终点 public: // 重载setA:1.双参数赋值 2.对象引用赋值 void setA(double x, double y) { a.setX(x), a.setY(y); } void setA(const Pointer& at) { a = at; } // 重载setB:两种传参方式 void setB(double x, double y) { b.setX(x), b.setY(y); } void setB(const Pointer& bt) { b = bt; } // 函数重载:普通版(返回值拷贝)、const常函数版(返回常引用) Pointer getA() { return a; } // 一般版本 const Pointer& getA() const { return a; } // 优化版本 Pointer getB() { return b; } const Pointer& getB() const { return b; } // const函数:计算两点间线段长度(勾股定理) double length() const { double dx = a.getX() - b.getX(); double dy = a.getY() - b.getY(); return sqrt(dx * dx + dy * dy); } };设计要点:
- 使用组合关系:Line包含两个Point对象
- 函数重载:提供多种参数类型的设置函数
- const成员函数:
length()不修改对象状态 - 返回常引用:避免不必要的对象拷贝
4. Rectangle类设计
Rectangle类表示长方形,由左下角和右上角两个Point构成。
// 长方形类(左下角+右上角两个Point构成矩形) class 长方形 { private: Pointer leftDown; // 左下角坐标点 Pointer rightUp; // 右上角坐标点 public: // 设置矩形两个顶点 void setData(double x1, double y1, double x2, double y2) { leftDown.setX(x1); leftDown.setY(y1); rightUp.setX(x2); rightUp.setY(y2); } // 获取长、宽 double getW() const { return fabs(rightUp.getX() - leftDown.getX()); } double getH() const { return fabs(rightUp.getY() - leftDown.getY()); } // 面积 double getArea() const { return getW() * getH(); } // 周长 double getPerimeter() const { return 2 * (getW() + getH()); } };5. Circle类设计
Circle类表示圆形,由圆心Point和半径组成。
// 圆形类(圆心Point+半径) class 圆 { private: Pointer center; // 圆心坐标 double r; // 半径 public: // 设置圆心和半径 void setData(double cx, double cy, double rad) { center.setX(cx); center.setY(cy); r = rad; } // 面积 πr² double getArea() const { const double PI = 3.1415926; return PI * r * r; } // 周长 2πr double getPerimeter() const { const double PI = 3.1415926; return 2 * PI * r; } };6. 主函数测试
下面是完整的测试代码,展示如何使用这些类:
#include <iostream> #include <cmath> using namespace std; // 包含上述所有类的定义... int main() { // 1.测试长方形:左下(1,1) 右上(4,5) → 宽3 高4 长方形 rect; rect.setData(1, 1, 4, 5); cout << "长方形宽:" << rect.getW() << " 高:" << rect.getH() << endl; cout << "长方形面积:" << rect.getArea() << " 周长:" << rect.getPerimeter() << endl; // 2.测试圆形:圆心(2,2) 半径3 圆 circle; circle.setData(2, 2, 3); cout << "圆形面积:" << circle.getArea() << " 周长:" << circle.getPerimeter() << endl; // 3.测试Point和Line Pointer p1; p1.setX(1.2); p1.setY(3.4); cout << "点坐标:(" << p1.getX() << ", " << p1.getY() << ")" << endl; Line line; line.setA(0, 0); line.setB(3, 4); cout << "线段长度:" << line.length() << endl; // 结果5 return 0; }7. 面向对象设计原则总结
1. 封装性:所有数据成员都声明为private,通过公有成员函数访问。
2. 组合关系:Line、Rectangle、Circle都包含Point对象,体现了"has-a"关系。
3. 代码复用:基于Point类构建更复杂的几何图形,避免重复代码。
4. 接口设计:提供清晰的公有接口,隐藏实现细节。
5. const正确性:不修改对象状态的函数都声明为const。
8. 扩展思考
可以进一步扩展这个设计:
- 添加Shape基类,定义统一的接口(如
getArea()、getPerimeter()) - 实现多态,通过基类指针管理不同几何图形
- 添加移动、旋转、缩放等变换功能
- 实现图形相交检测算法
- 添加文件序列化功能,保存和加载图形数据