今,c++で色を表すクラスを作っています.
色とはいっても,RGBやXYZなどいろいろな色がありますよね?もし,「各成分の合計を求める」なんて言う関数を作ろうと考えるとすると(必要ないですが^^…)RGBに対しても,XYZに対しても,というように2つ以上作るのは面倒です.そこで,n成分を持つ色のクラスというものを作って,そのクラスを継承して,RGB, XYZなどを表せないかと考えました.
つまり…
class color3{
double data[3];
~~~~~~
};
class rgb : public color3{
~~~~~~
};
class xyz : public color3{
~~~~~~
};
(実際color3はtemplateクラスで,double data[3]もポインタを使って要素数を変更できるようにしています.)
もちろんこの方法で正常に動いていますが….これではrgbクラスの変数cを宣言して,成分を参照するときに,赤色ならc.data[0],緑色ならc.data[1]というように,data[~]で参照しなければなりません.しかし,これでは見にくいと思っています><.できるなら赤色ならc.r, 緑色ならc.gというように参照したいです.もちろん派生クラスの中にdouble r, g, b; と宣言すればいいのですが…
.そうしてしまうと,一番最初の目的が達成できません.ポインタを使ったり,メンバの値を取得する関数(getR(), getX()みたいな…)を作れば解決できますが,この方法を使うと*(c.r), c.r()のような参照をしなければならず,「c.r」というようなきれいな参照はできません.贅沢を言っているようではありますが.c.rと表せるようなクラスの設計の仕方はあるでしょうか?
現在ぼんやりと考えているのは
class color3{
double data[3];
~~~~~~~
}:
class rgb : public color3{
double &r = data[0];
double &g = data[1];
double &b = data[2];
~~~~~~
};
class xyz : public class3{
~~~~~~
};
のように,参照変数を使えないか,と思っています.もちろん上の方法ではコンパイルエラー
となりましたが><
質問が長くなってしまいすいません><
よろしくお願いします.
必要ないかもしれませんが参考までに…
【環 境】MaxOS 10.6
【言 語】c++
【開発環境】Xcode
【 レベル 】プログラミング歴6年 c歴4年 c++歴1年の大学1年です
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;
}
試してみると,上手くいきました(^^)/
コンストラクタを使うって言う感覚が頭になかったです><
これでわかりやすく表せそうです^^
ありがとうございました
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; }
};
これでも大体要求を満たせるのではないかと思うのですが、いかがでしょうか。
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 とのインターフェイスは、完全に同じというわけにはいきません。
このあたり、何を本質的とするか、何を固有のものとするかというのも考えるべきところです。
やはり要素はprivate:で宣言しておいた方が,安全なんですね.いつもめんどくさがってpublic:で宣言してしまうので気をつけなければなりません><
回答ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Visual Basic(VBA) ダブルクリックでセルの色を変える 1 2022/12/24 15:52
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- HTML・CSS HTML & CSS 縦ボックス内の文字の左右センタリング 3 2023/03/25 04:23
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
インクリメント演算子のみを用...
-
Linux Cプログラミングを学ぶた...
-
右ビットシフト
-
Windows formアプリで データグ...
-
プログラミングについて。 1つ...
-
これなにがちがうんですか??
-
c言語
-
chatgptでつくってもらったコー...
-
ArduinoのジャイロモジュールMP...
-
Notepad++の関数リスト表示の変...
-
どちのほうがすきですか?
-
WindowsのCapsLock(キャップス...
-
質問失礼します。 プログラム言...
-
どなたかこのプログラミングを...
-
VisualStudio2022でC言語プログ...
-
大量のデータを読み込んで表示...
-
C言語をコンパイルするとコンピ...
-
double型が正常に認識されてい...
-
Notepad++の関数リスト表示でC...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報