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

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

配列はその隣接性を保証しますが、float rの後に関連していない別のメンバー変数を誤って追加することで、隣接性を台無しにする可能性があるためです。


パフォーマンスに関しては違いはありません。

于 2012-07-04T15:53:20.787 に答える
3

2つ目が一番いいと思います。

まず、変数に含まれるデータは(物理的に)配列内にあるとは想定されていません。たとえば、3人の生徒がいるクラスがある場合、それ以上でもそれ以下でもない場合は、生徒を配列に配置します。これは、生徒が配列であるためですが、ここでは色だけです。

第二に、あなたのコードを読む人は、2番目のケースでもあなたの変数が何を含んでいるかを本当に速く理解することができます(rは赤など)。配列の場合はそうではありません。

第三に、バグが少なくなり、「ああ、私の配列では、赤は0、gは1、bは2」を覚えておく必要がなく、誤って置き換えることはありません。

return color_values[0]

return color_values[1]

あなたのコードで。

于 2012-07-04T15:48:44.083 に答える
2

あなたは正しいと思います。「それはプログラマー次第であり、何がより理にかなっているように思われるか」。これが私のプログラムである場合、私はそれについてあまり心配することなくいずれかの形式を選択し、次にプログラムの他の部分をいくつか書き、後で問題を再検討します。

クラス指向の設計の利点の1つは、この種の内部実装の詳細を非公開にすることです。これにより、後で変更するのに便利です。

あなたの質問は重要だと思いますが、もっとコードを書くまではうまく答えられるとは思えません。要約すると、要素は3つしかなく、3つには赤、緑、青の名前が付いているので、どちらの方法でもかまいません。選択を余儀なくされた場合は、例2を選択します。

于 2012-07-04T15:51:59.637 に答える
1

このような場合に従うべき一般的なルールはありますか、それともプログラマー次第であり、何がより理にかなっているように思われますか?

それは間違いなくプログラマー次第であり、もっと理にかなっていることは何でもです。

あなたの場合、2番目のオプションがより適切であるように思われます。結局のところ、論理的に考えると、メンバーは値の配列ではなく、、、およびのrgですb

于 2012-07-04T15:46:00.010 に答える
0

プログラマーは、1回の書き込み操作を使用してデータをディスク(またはメモリ)に高速に保存するために、配列(またはデータ構造)を使用する場合があります。これは、大量のデータを読み書きする場合に特に便利です。

于 2012-07-10T08:30:53.037 に答える
0

アレイを使用する利点:

  • 保守性:配列内の値を使用してループできます
  • 保守性:多くのコードを変更する必要がない場合よりも、値を追加する必要がある場合(黄色など)。

不利益:

  • 読みやすさ:「値」の名前はより明確になります(つまり、この場合はr、g、b)。

あなたの場合、おそらくr、g、b変数が最適です。これは、色が追加される可能性が低く、3つの要素にわたるループの重要性が読みやすさよりも低いためです。

于 2012-07-04T15:48:17.920 に答える