2

、、、の4 つのクラスがAあります。BCD

  • Classにはclass Aのメンバーがあります。bB
  • ClassにはclassBのメンバーがあります。cC

AメンバーがいますD* dpointer;

この階層は保持する必要があります (実際、これは、アプリ、ウィンドウ、パネルをABおよびとして持つ GUI ですC)。

ここで、B と C は からのメソッドを使用する必要があります*dpointer

anddpointerのメンバーとして与えるよりもエレガントなものはありますか? 悪いですか?BC

4

4 に答える 4

2

直接ではありませんが、 D を a の中に入れることができますshared_ptr<D>。これにより、メモリ管理の問題が軽減される可能性があります。

于 2010-04-26T14:48:45.390 に答える
1
struct D;
struct CommonABC
{
   CommonABC(D * & dpointer) : dpointer(dpointer) {}
   D * & dpointer;
};
struct C : CommonABC 
{
   C (const CommonABC & common) : CommonABC(сommon) {}
};
struct B: CommonABC 
{
   B (const CommonABC & common) : CommonABC(сommon), c(common) {}
   C c;
};
struct A 
{
   A () : b(CommonABC(dpointer)) {}
   D * dpointer;
   B b;
};
于 2010-04-26T14:59:57.953 に答える
1

実際には、おそらく上記の shared_ptr ソリューションを選択するでしょう。しかし、インタビューの質問や BrainBench テストで見られるような、C++ の文献ではあまり取り上げられていない別の方法を次に示します。

struct D{
  D(int val);
  void foo();
};
struct C:private virtual D{
  void bar(){
    foo();
  } 
};
struct B:private C,private virtual D{
  void car(){
    foo();
  }
};

struct A:private B,private virtual D{   
   A(int val):D(val){}
   void aar(){
    car();
    foo();
   }

};

プライベート継承は、メンバーにするのと同じように、has-a 関係を実装します。唯一の違いは、各タイプを 1 つしか持てないことです。この場合、同じ D オブジェクトがコンポジション内のすべてのクラスで共有されます。

しかし、他の人が自分のしていることを理解できるようにしたい場合は、shared_ptrs を使用してください。

于 2010-04-26T16:00:32.643 に答える
1

この状況では、ポインターの代わりにBandへの参照を渡す必要があります。C@Billy ONeil が彼の回答shared_ptrで述べているように、可能かつ適切な場合は aまたは aを使用する必要があります ( andscoped_ptrについて詳しく知らなければ判断できません) 。andへの参照を渡すことには、これら 2 つはオブジェクトを使用するだけで、そのライフサイクルを制御しないこと、およびこれらのクラスを使用するには のインスタンスが必要であることを明確にするという利点があります (ポインターを使用するとオプションになります)。でのみメソッドを呼び出す場合は、const 参照を渡すこともできます。DdpointerABCDDNULLBCconstD

于 2010-04-26T15:09:50.777 に答える