jah*_*aho 10 c++ arrays class-design
我有一个理论上的问题,但是在设计类时我有时会遇到这个问题,而且在阅读其他代码时我看到它有所不同.以下哪项会更好,为什么:
例1:
class Color
{
public:
Color(float, float, float);
~Color();
friend bool operator==(Color& lhs, Color& rhs);
void multiply(Color);
// ...
float get_r();
float get_g();
float get_b();
private:
float color_values[3];
}
Run Code Online (Sandbox Code Playgroud)
例2:
class Color
{
public:
// as above
private:
float r;
float g;
float b;
}
Run Code Online (Sandbox Code Playgroud)
在这样的情况下是否应该遵循一般规则,还是仅仅取决于程序员以及看起来更有意义?
Kos*_*Kos 10
都!
用这个:
class Color {
// ...
private:
union {
struct {
float r, g, b;
};
float c[3];
};
};
Run Code Online (Sandbox Code Playgroud)
然后c[0]将等同于r等等.
这取决于您是否打算迭代整个数组?
既然如此,我认为方案1更合适。当您有对数据进行循环操作的函数时,拥有这样的数组非常有用
例如
void BumpColors(float idx)
{
for (int i = 0; i < 3; ++i)
color_values[i] += idx;
}
Run Code Online (Sandbox Code Playgroud)
与
void BumpColors(float idx)
{
color_values[0] += idx;
color_values[1] += idx;
color_values[2] += idx;
}
Run Code Online (Sandbox Code Playgroud)
当然,这是微不足道的,我认为这确实是一个偏好问题。在极少数情况下,您可能会使用 API 来获取指向数据的指针,并且虽然您可以这样做
awesomeAPI((float*)&r);
Run Code Online (Sandbox Code Playgroud)
我更愿意做
awesomeAPI((float*)&color_values[0]);
Run Code Online (Sandbox Code Playgroud)
因为数组将保证其连续性,而如果错误地添加另一个在 float r 之后不相关的成员变量,则可能会弄乱连续性。
就性能而言,没有什么区别。