- ベストアンサー
C++ クラスについて
クラスについて今勉強しています。 そこで質問なんですが クラスの中にクラスというのは実現可能なのでしょうか? クラスAの中にクラスBとクラスCが入っている状態で、 クラスAの中にある関数XでクラスBやCの関数を呼ぶような処理を目指しています。 またクラスAに宣言されている変数をクラスB,Cの中で変更したりできないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> この状況ではクラス内で関数が大量にでき不自然さを感じ メンバ関数は本当に必要なものだけに限定し、それ以外は非メンバ、非friendの関数にするのが望ましいと思います。(今回の件に限らず、常にそうです) また、適切にテンプレートを組み合わせることで、かなりすっきりした構成になることがあります。一度検討してみてください。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
> class ClassA{ > public: > int x; > ClassB Bclass; > void testA(); > }; これはクラスの中にクラスがあるのではなく、クラスの中にクラス型のデータメンバがある例です。したがって、まったく話が異なります。 > このような状態の場合xを変更するにはどうすればよいのでしょうか? 今回の例に限れば、ClassAはC互換構造体のようですので、thisからoffsetof(ClassA, Bclass)バイト分を引いてからClassA*にキャストすれば、とりあえずxにアクセスすることはできます。 ただし、ClassAのメンバではなくClassBには対応できません。 現実的な解決策としては、ClassBのコンストラクタでClassAへの参照なりポインタなりを受け取り、それをデータメンバとして保持するのが妥当です。 しかし、このような密な関係のクラスではなく、もっと別の解決策があるように思います。それについては、こんな簡単な例ではなく、実際に何をやりたいのかがわからないとどうしようもありません。
補足
クラスの中にクラス型のデータメンバを追加するだけではやはり無理ですか ポインタを使う方法なら確かに私の言っていたことが実現できそうですが、やはり解決策としては適当ではないようですね 今作ろうとしているのですが流れでは while(1){ クラスA.Loop(); 以降その他処理 } このような状態になっています。 クラスAではLoop以外にほかの処理の関数もがあります。 class ClassA{ public: void testA(); void testB(); void Loop(); }; void ClassA::Loop() { testA(); testB(); } となっていました。 この状況ではクラス内で関数が大量にでき不自然さを感じ クラスの中でもうひとつ階層を作りそこで関数を作ろうと考えました。 void ClassA::Loop() { a.testA(); b.testB(); } このような感じに使いたかったのですが。 他の方法を考えてみたいと思います。ありがとうございました
- jacta
- ベストアンサー率26% (845/3158)
> クラスの中にクラスというのは実現可能なのでしょうか? 可能です。 > またクラスAに宣言されている変数をクラスB,Cの中で変更したりできないでしょうか? メンバ変数をpublicにするか、クラスBおよびCをfriendにする必要があります。
補足
回答ありがとうございます。 一応組んでみたものです。 class ClassB{ public: void testB(); }; class ClassA{ public: int x; ClassB Bclass; void testA(); }; void ClassA::testA(){ Bclass.testB(); } void ClassB::testB(){ x=0; //ここで呼び出せない } このような状態の場合xを変更するにはどうすればよいのでしょうか?
お礼
確かにメンバ関数をうまく使うことが重要だと感じました。 適切なテンプレートなど使うようにしてすっきりさせようと思います。 ありがとうございました。