10

我有一点理论问题,但这是我在设计类时有时会遇到的问题,我在阅读其他代码时发现它的做法有所不同。以下哪一项会更好,为什么:

示例 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;
}

在这种情况下是否应该遵循一般规则,或者它只是由程序员决定,什么似乎更有意义?

4

7 回答 7

10

两个都!

用这个:

class Color {

    // ...

private:

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

};

然后c[0]将等价于r, 等等。

于 2012-07-04T15:55:40.607 回答
4

这取决于,您是否打算遍历整个数组?

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

例如

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

对比

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]);

因为数组将保证其连续性,而您可能会通过错误地添加另一个在 float r 之后不相关的成员变量来弄乱连续性。


性能方面没有区别。

于 2012-07-04T15:53:20.787 回答
3

我会说第二个是最好的。

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

其次,阅读您的代码的人也可以在第二种情况下非常快地理解您的变量包含的内容(r 是红色等)。数组不是这种情况。

第三,bug少了,不用记住“哦,在我的数组中,red是0,g是1,b是2”,不会误替换

return color_values[0]

经过

return color_values[1]

在你的代码中。

于 2012-07-04T15:48:44.083 回答
2

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

面向类的设计的好处之一是它使这种内部实现细节成为私有的,这样以后可以方便地更改它们。

我认为您的问题确实很重要,只是我怀疑在编写更多代码之前能否很好地回答它。在摘要中,只有三个元素,并且这三个元素都有名称——红色、绿色和蓝色——所以我认为你可以选择任何一种方式。如果被迫选择,我选择示例 2。

于 2012-07-04T15:51:59.637 回答
1

在这种情况下是否应该遵循一般规则,或者它只是由程序员决定,什么似乎更有意义?

这绝对取决于程序员,任何更有意义的事情。

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

于 2012-07-04T15:46:00.010 回答
0

使用数组的优点:

  • 可维护性:可以使用数组中的值进行循环
  • 可维护性:什么时候应该添加一个值(比如黄色?)而不需要更改很多代码。

坏处:

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

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

于 2012-07-04T15:48:17.920 回答
0

有时程序员会使用数组(或数据结构),以便使用 1 次写入操作将数据更快地保存到磁盘(或内存)。如果您正在读取和写入大量数据,这将特别有用。

于 2012-07-10T08:30:53.037 回答