1

A次のようなクラスがあります。

class A {
// A's internal state
public:
  void someMethod();
  void anotherMethod();
};

A別のクラス内で使用したいBBのサブタイプにはなりたくありませんが、のパブリック メソッドに何らかの形で のユーザーがアクセスできるようにしAたいと考えています。AB

Aこれを実現する 1 つの方法は、 のインスタンスをのパブリック メンバーとして単純に含めることBです。

class B {
public:
  A a;
  // other members
};

もう 1 つはA、 のプライベート メンバーになり、のパブリック メソッドのBラッパーを提供することです。A

class B {
  A a;
public:
  void someMethod(){ a.someMethod(); }
  void anotherMethod(){ a.anotherMethod(); }
}

これを行うための「好ましい」方法があるかどうか (または、上記の 2 つの選択肢を含まない方法があるかどうか)、または単に好みの問題であるかどうかを知りたいです。ありがとう。

4

2 に答える 2

6

さらに別の方法は次のとおりです。

class B : private A
{
public:
    using A::someMethod;
    using A::anotherMethod;
};
于 2012-06-20T18:31:47.063 に答える
2

これを行うための「好ましい」方法があるかどうか (または、上記の 2 つの選択肢を含まない方法があるかどうか)、または単に好みの問題であるかどうかを知りたいです。ありがとう。

それは本当にここで具体的になると思います。

継承が意味をなさない場合、継承よりも構成を好むのは正しいことです。Aそれをどのように実装するかは、パブリックのインスタンスを作成することが理にかなっているのかどうかによって異なります。

変更したくない状態Aや公開したくない機能はありますか?の関数の1 つが呼び出されたときに、前処理または後処理を実行しますAか? ユーザーが のインスタンスを別のインスタンスに設定することを気にしますAか? おそらくそうするでしょう (getter 関数を作成することもできますが) ので、この場合は関数をラップすることをお勧めします。

A完全に公開する方が理にかなっていますか? もしそうなら、定型コードの束を書かないことで時間を節約できます。

ここでは、ラッパー クラスのセマンティクスに帰着します。

于 2012-06-20T18:35:41.397 に答える