• 締切済み

識別子の指定方法?

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のクラスインスタンスを管理したいのです 何か方法は無いものでしょうか… よろしくお願いします

みんなの回答

  • S117
  • ベストアンサー率40% (18/45)
回答No.3

スーパークラスがサブクラスのことを知っているというのは、継承関係として正しくないですね。 スーパークラスはすべてのサブクラスの共通の性質を持つべきで、それぞれのサブクラス固有の性質を持ってはなりません。 実際にどういう用途を想定しているのかわかりませんが、この場合は抽象クラスを使うべきケースのように思います。 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のインスタンスを管理する新しいクラスを作ってください。

yamidare
質問者

お礼

回答ありがとうございます 構造自体が良いものではなかったのですね >継承関係を持たない管理用クラスが必要なのかもしれません。 そうかもしれないですねー、また暫く考えてみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「ポインタを使う」だけならクラスを宣言しておけばいい. インスタンスを作ったりメンバを使ったりするならクラスを定義しなきゃならない. ということで #1 のようになるんだけど.... そもそも何をしたいんだろう.

yamidare
質問者

補足

回答ありがとうございます、 説明不足で申し訳ありません。 基本クラスaに、継承したb,c,dクラスの、 クラスインスタンスをそれぞれ格納したかったのです。

回答No.1

#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(); }

yamidare
質問者

お礼

確かにこの方法を使うと動きました。 クラスbを先に宣言しておいて、クラスaのメンバ関数の定義は、 クラスbの定義が終わった後にやればいいのですね。 ありがとうございました。

関連するQ&A

専門家に質問してみよう