You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
    

内容的提问来源于stack exchange,提问作者supermiedos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:05