C++使用初始化列表前的数据校验:Triangle类Point参数构造合法性验证
解决Triangle类构造时的合法性校验方案
- 首先优化初始化列表
Point类支持拷贝构造(编译器会默认生成拷贝构造函数),你原有的初始化列表拆分调用getX、getY完全没必要,可以直接简化:
Triangle(Point p1, Point p2, Point p3): v1(p1), v2(p2), v3(p3) { // 校验逻辑写在构造函数体内即可 }
- 补全合法性校验逻辑
你原有的代码仅判断了一组边的关系,需要覆盖任意两边之和大于第三边的全部三种情况;同时由于浮点数计算存在精度误差,建议设置极小的阈值epsilon避免误判:
// 先补全Point类的distance方法实现 double Point::distance(Point p) { double dx = x - p.x; double dy = y - p.y; return sqrt(dx * dx + dy * dy); } // Triangle构造函数内的校验逻辑 const double EPS = 1e-6; // 阈值可根据你的精度需求调整 double d12 = v1.distance(v2); double d23 = v2.distance(v3); double d13 = v1.distance(v3); bool isValid = (d12 + d23 > d13 + EPS) && (d12 + d13 > d23 + EPS) && (d23 + d13 > d12 + EPS);
- 选择校验失败后的处理方案
构造函数没有返回值,你可以根据业务需求二选一:- 方案1:抛出异常(推荐)
校验不通过时直接抛出标准异常,是C++构造函数出错的标准实践,调用方可以捕获异常处理非法输入场景:
#include <stdexcept> if (!isValid) { throw std::invalid_argument("传入的三个点无法构成合法三角形"); }- 方案2:降级为默认合法三角形
如果你不想引入异常机制,可以在校验失败时将三个顶点重置为固定的合法三角形:
if (!isValid) { v1 = Point(0, 0); v2 = Point(1, 0); v3 = Point(0, 1); } - 方案1:抛出异常(推荐)
内容的提问来源于stack exchange,提问作者supermiedos
相关产品推荐
相关产品推荐

