半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2019-1-4
|
发表于 2024-10-18 12:04
来自手机
|
显示全部楼层
在C++中直接使用 {} 初始化方式进行赋值时,只能用于变量声明时。对于像 RECT 这样的结构体,在已经声明过的变量上使用 {} 赋值会导致语法错误。要实现简便的赋值方式,确实可以通过重载 = 运算符或者宏定义来实现。
解决方案 1:重载赋值运算符
通过为 RECT 结构体重载赋值运算符,我们可以实现类似 {} 语法的赋值功能。由于 RECT 是 Windows API 中的一个标准结构体,不能直接修改其定义,因此我们可以创建一个包装类来实现这一功能。
#include <windows.h>
#include <iostream>
// 包装类
class MyRect {
public:
RECT rect;
// 默认构造函数
MyRect() {
SetRect(&rect, 0, 0, 0, 0);
}
// 参数化构造函数
MyRect(LONG left, LONG top, LONG right, LONG bottom) {
SetRect(&rect, left, top, right, bottom);
}
// 重载赋值运算符
MyRect& operator=(const MyRect& other) {
rect = other.rect;
return *this;
}
// 重载赋值运算符,接受初始化列表
MyRect& operator=(std::initializer_list<LONG> list) {
if (list.size() == 4) {
auto it = list.begin();
rect.left = *it++;
rect.top = *it++;
rect.right = *it++;
rect.bottom = *it;
}
return *this;
}
};
int main() {
MyRect r;
// 通过赋值运算符来赋值
r = {0, 0, 6, 8};
std::cout << "r: " << r.rect.left << ", " << r.rect.top << ", "
<< r.rect.right << ", " << r.rect.bottom << std::endl;
r = {5, 6, 400, 600};
std::cout << "r: " << r.rect.left << ", " << r.rect.top << ", "
<< r.rect.right << ", " << r.rect.bottom << std::endl;
return 0;
}
解决方案 2:使用宏定义
宏定义也是一种简便的方法,但其灵活性和安全性不如重载运算符。使用宏定义的方法可以避免修改代码结构,适合在不希望修改现有结构体定义时使用。
#include <windows.h>
#include <iostream>
#define SET_RECT(r, l, t, ri, b) (r.left = (l), r.top = (t), r.right = (ri), r.bottom = (b))
int main() {
RECT r;
// 使用宏定义来赋值
SET_RECT(r, 0, 0, 6, 8);
std::cout << "r: " << r.left << ", " << r.top << ", "
<< r.right << ", " << r.bottom << std::endl;
SET_RECT(r, 5, 6, 400, 600);
std::cout << "r: " << r.left << ", " << r.top << ", "
<< r.right << ", " << r.bottom << std::endl;
return 0;
}
总结
重载运算符 的方式更加灵活和现代化,适用于需要更好可维护性和扩展性的代码。
宏定义 则更加直接,适合不想进行较大代码改动的场景。
你可以根据具体需求选择最适合的方案。
神奇的ai
—— 来自 鹅球 v3.2.91 |
评分
-
查看全部评分
|