C++ 使用联合来提供更多这样的访问方法安全吗?
我正在创建一个4x4矩阵类,数据在内部表示为16个浮点数组。有时我可能想直接访问此阵列,但有时我可能只想按名称访问阵列插槽C++ 使用联合来提供更多这样的访问方法安全吗?,c++,matrix,3d,unions,C++,Matrix,3d,Unions,我正在创建一个4x4矩阵类,数据在内部表示为16个浮点数组。有时我可能想直接访问此阵列,但有时我可能只想按名称访问阵列插槽 class Matrix{ union{ float array[16]; struct{ float a1, a2, a3, a4; float b1, b2, b3, b4; float c1, c2, c3, c4; float d1
class Matrix{
union{
float array[16];
struct{
float a1, a2, a3, a4;
float b1, b2, b3, b4;
float c1, c2, c3, c4;
float d1, d2, d3, d4;
}named;
struct{
float a[4];
float b[4];
float c[4];
float d[4];
}row;
}
}
// use
m.array[3] = 1.5f;
m.named.d1 = m.row.a[3];
printf("%f", m.named.d1); // should be 1.5
这类事情是正常的,还是会以我做梦也想不到的方式严重适得其反?
看起来是后者,但我真的很喜欢有多个访问方法
这是用于处理图形的3D点。这本身是一个单独的问题,但是对于已经解决了这些问题的库,任何建议都是完全受欢迎的。访问非活动的联盟成员不是C。虽然它在某些编译器上工作,但在其他编译器上可能会失败。所以至少你不能声称你的代码是可移植的。@drop-aw,我很害怕。我想我在技术上可以使用getter方法,但是16+方法定义太麻烦了。我想我必须坚持使用数组。如果你想给用户提供方便,你也可以重载操作符[]或操作符,来模拟多维数组。这就是大多数C++数学库的做法。它们中的一些还通过重载运算符提供了不同的矩阵/向量进出方式。这样,您可以保持代码正常,并为用户提供比联合别名更好的语法支持