C++结构体_rect设置x/y/宽高后如何自动计算x2、y2的值?
你当前写法的问题说明
你现有代码中x2、y2的默认初始化仅会在结构体实例构造阶段执行一次,构造完成后手动修改x、y、width、height的值不会触发x2、y2的重新计算,会出现数据不一致的问题,下面给出两种可实现需求的方案:
方案1:添加自定义构造函数,创建实例时自动计算x2、y2
适合创建实例后不会再修改x、y、宽高的场景,创建实例时直接传参即可,不需要手动赋值x2、y2:
struct _rect { // 保留无参默认构造函数,支持默认初始化 _rect() = default; // 带参构造函数:传入左下角坐标、宽高,自动计算右上角顶点 _rect(int x_, int y_, int width_, int height_) : x(x_), y(y_), width(width_), height(height_) , y2(y + height), x2(x + width) {} // 左下角顶点 int x = 0; int y = 0; // 宽高 int width = 0; int height = 0; // 右上角顶点 int y2 = 0; int x2 = 0; }; // 初始化时直接传参即可,无需手动给x2、y2赋值 _rect rect01(50, 50, 200, 200);
局限:如果后续修改了x、y、宽高等基础参数,需要手动重新计算赋值x2、y2,否则会出现数据不一致。
方案2:将x2、y2改为只读成员函数(更推荐,无同步问题)
不需要额外存储x2、y2变量,每次取值时实时计算,永远和当前的基础参数保持一致,完全不需要手动赋值:
struct _rect { // 保留构造函数方便初始化 _rect() = default; _rect(int x_, int y_, int width_, int height_) : x(x_), y(y_), width(width_), height(height_) {} // 左下角顶点 int x = 0; int y = 0; // 宽高 int width = 0; int height = 0; // 成员函数实时计算右上角,const修饰保证不会修改结构体成员 int y2() const { return y + height; } int x2() const { return x + width; } }; // 初始化方式 _rect rect01(50, 50, 200, 200); // 调用成员函数获取x2、y2的值 int right_x = rect01.x2(); // 返回250 int top_y = rect01.y2(); // 返回250 // 后续修改基础参数后,调用函数自动返回最新值,无需任何手动赋值操作 rect01.x = 100; // 此时rect01.x2()返回300,自动同步更新
优势:完全避免数据不同步的问题,不需要额外维护x2、y2两个变量,代码可维护性更高。如果你的场景中需要频繁读取x2、y2且几乎不会修改基础参数,也可以选择方案1,性能损耗更低。
内容的提问来源于stack exchange,提问作者Mo_AminKiaee
相关产品推荐
相关产品推荐

