今C++でクラスの設計をしています。
どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。
class A{
private:
int id;
public:
int getId();
void setId();
};
class B{
private:
int id;
public:
int getId();
void setId();
}
class C{
private:
int id;
public:
int getId();
void setId();
}
この三つのクラスが、共通な機能があります。また、実装も同じで、
継承を利用して、どう設計すれば、いいですか?
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
継承でなく委譲(#3の回答のようなやり方)を使うのは、一般に
「インタフェースと実装の分離」という方針によるものと推測します。
他言語では"interface"というものが明示的に存在したり、
多重継承に制限があったりするので良くある手ですが、
C++の場合は、実装の継承にprivateな継承を使う手もなくはないです。
> class A: classD
↑こういう形ですね。
この場合のポイントは、class A : public classDではなく、class A : (private) classDであること。
classDとして扱われない(classDはただの実装用の存在であって、
設計上、classDとして扱われることを想定していない/べきでない)ということですが。
(以下、蛇足)
ちなみに、「できるだけclass」がもしstructのことをさしているなら(違ったら失礼)、
C++のstructはclassの一種でデフォルトがpublic:なものに過ぎず、
struct IInterface
{
↓こう読み替えても大差なし。
class IInterface
{
public:
# 後、C++でスマートポインタを否定すると旨みが減りますね。
# 例外脆弱なコードになりがちですし…。
No.3
- 回答日時:
>class A: classD
>class B: classD
>class C: classD
>
> 以上の形にすることでしょうか?
いいえ
class A {
D d_;
public:
...
};
な風にするということです。
No.2
- 回答日時:
こんにちは。
こんな感じでしょうか。参考程度に。struct IInterface
{
virtual ~IInterface(){}
virtual int getId() = 0;
virtual void setId(/*???*/) = 0;
};
struct CInterface : public IInterface
{
protected:
CInterface(int id_) : id(id_)
{}
virtual int getId(){ return this->id; }
virtual void setId(/*???*/){ /*this->id = ???*/; }
private:
int id;
};
struct A : public CInterface
{
static std::auto_ptr<IInterface> CreateInstance(int id){ return new A(id); }
private:
explicit A(int id_) : CInterface(id_)
{}
};
struct B : public CInterface
{
static std::auto_ptr<IInterface> CreateInstance(int id){ return new B(id); }
private:
explicit B(int id_) : CInterface(id_)
{}
};
struct C : public CInterface
{
static std::auto_ptr<IInterface> CreateInstance(int id){ return new C(id); }
private:
explicit C(int id_) : CInterface(id_)
{}
};
int main(void)
{
std::auto_ptr<IInterface> aptr[] = {A::CreateInstance(1), B::CreateInstance(2), C::CreateInstance(3)};
for(int i = 0; i < sizeof(aptr) / sizeof(aptr[0]); ++i)
{
cout << aptr[i]->getId() << endl;
}
return 0;
}
この回答への補足
返事していただいて、ありがとうございました。
追加したいですが、ちょっとスマートポインタを使いたくないです。
また、できるたけ、classで実装したいということです。
すみませんが、ありがとうございました。
No.1
- 回答日時:
実装を継承したい場合は C++ の文法で言う継承はせずに、
共通の実装クラスを個別のクラスでメンバ変数として保持するのが普通だと思います。
ちょっと、くわしく教えていただけませんか?
例えば、class D を作る。
class D{
protected:
int id;
public:
int getId();
void setId();
}
class A: classD
class B: classD
class C: classD
以上の形にすることでしょうか?
あるいは、もっといい設計がないしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
コード中の謎のエラー
-
6桁の数字を重複なしでランダム...
-
JAVA エラー 式の開始が不正で...
-
Javaで電卓を作りたい
-
コンストラクタ内で別のコンス...
-
偶数奇数の判定
-
消費税を計算
-
iアプリでバイナリデータを16進...
-
前日日付の取得
-
Java 初心者 int型の取り扱い方
-
javaappletでgifアニメーション
-
java 継承
-
すいません、質問というか困っ...
-
VBAで配列の計算
-
配列にnullを代入すると、null...
-
ループ処理の際、最後だけ","を...
-
配列をセッションに割り当てた後で
-
1~100までの数字を表示し、か...
-
Log4jで機能毎に別ファイルへ出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
javaでカレンダー作成
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
C#で実行時にメソッドの返り値...
-
(Swing)JTextFieldを半角のみ入...
-
c# デリゲート関連の命名について
-
Javaでポインタ的なことはでき...
-
複数のボタンを配置し、それぞ...
-
JUnit4のアノテーションについて
-
javaのエラーの意味がわかりま...
-
intが負の時に投げる例外はあり...
-
sin曲線とcos曲線を描くプログ...
-
C++からC#のdllを参照する際、...
-
Java 初心者 int型の取り扱い方
おすすめ情報