• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c++でのクラス設計について)

c++でのクラス設計について

このQ&Aのポイント
  • c++で色を表すクラスを作成する際に、色の成分を参照する方法について悩んでいます。
  • 現在は配列を使用して成分を参照しているが、見やすさを考慮して、クラス内で成分を参照する方法を模索している。
  • 参照変数を使用する方法も考えているが、コンパイルエラーが発生している。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

これ↓ではいかがです? #include <iostream> using namespace std; class color3{ public: double data[3]; }; class rgb : public color3{ public: double &r; double &g; double &b; rgb() : r(data[0]), g(data[1]), b(data[2]) {} }; int main() { rgb x; x.data[0] = 1.23; cout << x.r << endl; x.g = 4.56; cout << x.data[1] << endl; }

hira_kazu
質問者

お礼

 試してみると,上手くいきました(^^)/  コンストラクタを使うって言う感覚が頭になかったです><  これでわかりやすく表せそうです^^  ありがとうございました

その他の回答 (2)

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.3

class color3 { public:  virtual double* data() = 0;  double& data(int idx) { return data()[idx]; } }; class rgb : public color3 { public:  double r, g, b; public:  virtual double* data() { return &r; } }; class xyz : public color3 { public:  double x, y, z; public:  virtual double* data() { return &x; } }; これでも大体要求を満たせるのではないかと思うのですが、いかがでしょうか。

hira_kazu
質問者

お礼

 仮想メンバを使うって言う手があったんですね.  1度試してみます^^  回答ありがとうございました

回答No.2

クラスを設計するとき、特に何かを継承するとき、「本質的な部分は何か?」というのを常に意識しなければなりません。 この例だと、そもそも、color3 というクラスは何者でしょうか? 色を表す基底クラスですか? だとすると、どのあたりが「色」の性質なのでしょう? もし、本当に「色」を表すものなら、色としての本誌的な情報を持っているはずなので、これを継承する rgb などのクラスと相互に変換できる必要があるでしょう。 もしかしたら、これは、単なる「N個の数値に関するいろいろな演算をまとめた」クラスかもしれません。 この場合だと、いろいろな色を表すのに共通して使うかもしれませんが、「色」ではありません。 この場合、直接継承するのではなく、メンバーとして持つほうが間違いがありません。 calss color3 // たぶん、名前は変えた方がいい { }; class rgb { private: color3 basicList; public: double r; double g; double b; } です。 また、本当は、「色」という機能を持った場合、r の値を変更するといろいろと副作用があるはずです。 全体としての明るさが変わるとか。 そういうつじつまあわせを確実に行うためには、r, g ,b を public: なメンバーにするよりも、getter や setter 経由で使う private: なメンバーにしておく方が安全です。 また、共通の「色」のクラスから継承したとしても、r, g b, というものをあからさまにしてしまう時点で、x, y, z とのインターフェイスは、完全に同じというわけにはいきません。 このあたり、何を本質的とするか、何を固有のものとするかというのも考えるべきところです。

hira_kazu
質問者

お礼

 やはり要素はprivate:で宣言しておいた方が,安全なんですね.いつもめんどくさがってpublic:で宣言してしまうので気をつけなければなりません><  回答ありがとうございました

関連するQ&A