类设计:数组与多个变量

时间:2012-07-04 15:42:53

标签: 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];
}

示例2:

class Color
{
public:
  // as above

private:
  float r;
  float g;
  float b;
}

在这样的情况下是否应该遵循一般规则,还是仅仅取决于程序员以及看起来更有意义?

7 个答案:

答案 0 :(得分:10)

两个!

使用此:

class Color {

    // ...

private:

    union {
       struct {
           float r, g, b;
       };
       float c[3];
    };

};

然后c[0]将等同于r等等。

答案 1 :(得分:4)

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

在这种情况下,我认为解决方案1更合适。 当您拥有在数据循环中运行的函数时,拥有类似的数组非常有用

e.g。

void BumpColors(float idx)
{
    for (int i = 0; i < 3; ++i)
        color_values[i] += idx;
}

VS

void BumpColors(float idx)
{
    color_values[0] += idx;
    color_values[1] += idx;
    color_values[2] += idx;
}

当然这是微不足道的,我认为这确实是一个偏好问题。在某些罕见的情况下,您可能会使用API​​来获取指向数据的指针,尽管您可以执行

awesomeAPI((float*)&r);

我更喜欢做

awesomeAPI((float*)&color_values[0]);

因为数组将保证其连续性,而你可以通过错误地添加另一个在浮动r之后不相关的成员变量来搞乱连续性。


表现明智,没有区别。

答案 2 :(得分:3)

我会说第二个是最好的一个。

首先,您的变量包含的数据不应该(物理上)在数组中。例如,如果你有一个有3个学生的班级,而不是更多,而不是更少,你会把它们放在一个阵列中,因为他们是一群学生,但在这里,它只是颜色。

其次,读取代码的人也可以在第二种情况下快速理解变量包含的内容(r是红色等)。数组并非如此。

第三,你会有更少的错误,你将不必记住“哦,在我的数组中,红色是0,g是1,b是2”,你不会被错误替换

return color_values[0]

通过

return color_values[1]

代码。

答案 3 :(得分:2)

我认为你是对的:“这只取决于程序员,而且似乎更有意义。”如果这是我的程序,我会选择一种形式或另一种形式而不用担心太多,然后编写程序的其他部分,然后再重新审视此事。

面向类设计的一个好处是它使这种内部实现细节 private,,这样可以方便以后更改它们。

我认为你的问题确实很重要,只是我怀疑在一个人写了更多代码之前,人们可以很好地回答这个问题。在摘要中,只有三个元素,三个元素都有名称 - 红色,绿色和蓝色 - 所以我认为你可以采用任何一种方式。如果被迫选择,我选择例2。

答案 4 :(得分:1)

  

在这样的情况下是否应该遵循一般规则,还是仅仅取决于程序员以及看起来更有意义?

这绝对取决于程序员和任何更有意义的东西。

在您的情况下,第二个选项似乎更合适。毕竟,从逻辑上考虑,您的成员不是值数组,而是rgb的值。

答案 5 :(得分:0)

使用数组的优点:

  • 可维护性:您可以使用数组中的值循环
  • 可维护性:何时应添加一个值(如黄色?),而不是更改大量代码。

缺点:

  • 可读性:'值'具有更清晰的名称(在这种情况下为r,g,b)。

在你的情况下,r,g,b变量可能是最好的,因为它不太可能添加颜色,并且超过3个元素的循环可能不如可读性重要。

答案 6 :(得分:0)

有时程序员会使用数组(或数据结构) 为了使用1次写操作将数据更快地保存到磁盘(或内存)。 如果您正在阅读和编写大量数据,这将非常有用。