类设计:数组与多个变量

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等等.


Jul*_*bot 4

这取决于您是否打算迭代整个数组?

既然如此,我认为方案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 之后不相关的成员变量,则可能会弄乱连续性。


就性能而言,没有什么区别。