- 締切済み
識別子の指定方法?
C++の勉強を始めたのですが、C++のクラスで、 なかなか分からない無い部分があるので、質問させてください。 表現方法が今一分からないのですが 基本クラスで、派生クラスのインスタンスを格納する領域を作りたいのですが、その方法が分かりません。 例えば class a { b* ob2; public: void b_in(){ ob2 = new b; } void show(){ ob2->show(); } }; class b :public a { public: void show(){cout << "出力する";} }; main() { a ob; ob.b_in(); ob.show(); } (当然上プログラムはバグが出ます) という形で、クラスaで、bのクラスインスタンスを管理したいのです 何か方法は無いものでしょうか… よろしくお願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- S117
- ベストアンサー率40% (18/45)
スーパークラスがサブクラスのことを知っているというのは、継承関係として正しくないですね。 スーパークラスはすべてのサブクラスの共通の性質を持つべきで、それぞれのサブクラス固有の性質を持ってはなりません。 実際にどういう用途を想定しているのかわかりませんが、この場合は抽象クラスを使うべきケースのように思います。 class a { public: virtual void show() = 0; }; class b :public a { public: void show(){cout << "出力する" << endl;} }; class c :public a { public: void show(){cout << "出力します" << endl;} }; main() { b obb; c obc; a *ob; ob = &obb; ob->show(); ob = &obc; ob->show(); } b_in() c_in() d_in() ... など、サブクラスごとに用意するつもりだったのなら、悪いことは言わないので、上のような構造に変更してください。 なぜスーパークラスにサブクラスのインスタンスを持たせたいのかわかりませんが、もしかするとスーパークラスとは別に継承関係を持たない管理用のクラスが必要なのかもしれません。 そうであれば、クラスaのインスタンスを管理する新しいクラスを作ってください。
- Tacosan
- ベストアンサー率23% (3656/15482)
「ポインタを使う」だけならクラスを宣言しておけばいい. インスタンスを作ったりメンバを使ったりするならクラスを定義しなきゃならない. ということで #1 のようになるんだけど.... そもそも何をしたいんだろう.
補足
回答ありがとうございます、 説明不足で申し訳ありません。 基本クラスaに、継承したb,c,dクラスの、 クラスインスタンスをそれぞれ格納したかったのです。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#include <iostream> class b; class a { b* ob2; public: void b_in(); void show(); }; class b :public a { public: void show() { std::cout << "出力する"; } }; void a::b_in() { ob2 = new b; } void a::show() { ob2->show(); } int main() { a ob; ob.b_in(); ob.show(); }
お礼
確かにこの方法を使うと動きました。 クラスbを先に宣言しておいて、クラスaのメンバ関数の定義は、 クラスbの定義が終わった後にやればいいのですね。 ありがとうございました。
お礼
回答ありがとうございます 構造自体が良いものではなかったのですね >継承関係を持たない管理用クラスが必要なのかもしれません。 そうかもしれないですねー、また暫く考えてみます。