2

私は継承の概念に慣れておらず、次の問題の解決策を見つけるのに苦労しています。

頭と手の2つのクラスがあります。これらのクラスのインスタンスは、主にベクトルの要素として使用します。2 つのクラスには、共通のメソッドとそれらに固有のメソッドがあります。

さらに、オブジェクトの共有ポインターを扱います。

これを実装する最善の方法は、このように BodyPart クラスを作成することだと思いました

class BodyPart
{
  public:
  typedef boost::shared_ptr<BodyPart> pointer;

  private:
  int commonMember1;
  double commonMember2;

  public:
  int commonMethod1();
  int CommonMethod2();
}

そして、このような2つの派生クラス

class Hand : public BodyPart
{
  public:
  typedef boost::shared_ptr<Hand> pointer;

  private:
  int numFingers;

  public:
  int getNumFingers();
  void printInfo();
}

最後に、BodyPart 要素のベクトルを宣言したいと思います。

std::vector<BodyPart::pointer> cBodyParts;

Hand または Head 要素のいずれかを含み、必要に応じてベクター要素でメソッドを呼び出します。

しかし、このアプローチはあまりうまく機能していないようです。どうやら、ベクトルの要素を取得しようとすると、コンパイラは、BodyPart 共有ポインターから Hand 共有ポインターに変換できないと文句を言います。さらに、ベクトルが上記のように宣言されている場合、その要素で派生クラスに固有のメソッド ( getNumFinger() など) を呼び出すことはできません (実際にはそのクラスからのものであっても)。

これに対処する適切な方法はありますか?それとも私のアプローチは完全に間違っていますか?前もって感謝します!

4

2 に答える 2

3

あなたのアプローチは正しいですが、コンパイラもそうです。基本クラスへの共有ポインターのベクトルがあるのは良いことですが、特定の機能を得るには実際の型にキャストする必要があります。

は役に立ちませんが、基本クラスでtypedef boost::shared_ptr<Hand> pointer;のみ必要です。typedefスマート ポインター間でキャストすることはありません。基本クラスの typedef の名前を

typedef boost::shared_ptr<BodyPart> BodyPartPtr;

けれど。

コメントの Alan による良い点: 基本型へのポインターを介して派生型へのポインターを (間接的に) 削除するため、UB を防ぐために基本クラスのデストラクタを仮想にする必要があります。

于 2013-01-04T13:02:35.120 に答える
2

あなたのアプローチは正しいです(実際には は必要ありませんがtypedef)、boost::static_pointer_castDoc here )を使用して、必要なときにからshared_ptr<BodyPart>に変換するだけです。shared_ptr<Hand>

また、学習のある時点でenable_shared_from_thisを見ているかもしれません。

于 2013-01-04T13:11:37.327 に答える