0

std::vector派生クラスへの共有ポインターを保持する がありcDerivedClass、基本クラスの共有ポインターも持っています。だから、このようなもの:

typedef SHARED_PTR<cBaseClass> cBaseClassPtr;

typedef SHARED_PTR<cDerivedClass> cDerivedClassPtr;

std::vector<cDerivedClassPtr> vDerivedPtrList;

CDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)cBaseClassPtr 型の引数を取り、それを派生クラスのベクトル (vDerivedPtrList) に追加するメソッドが必要な場合は、どうすればよいでしょうか?

基本クラスがポリモーフィックでない限り、動的キャストでは基本から派生への変換が許可されないため、dynamic_cast が機能しないことはわかっています。cBaseClassPtr を cDerivedClassPtr に静的にキャストしようとしましたが、エラーが発生しました。

void cDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)
{
    MY_ASSERT(inpBaseClass, "Component cannot be NULL");

    cDerivedClassPtr pDerviedPtrToAdd = static_cast<cDerivedClassPtr>(inpBaseClass);

    this->mvComponentList.push_back(pDerviedPtrToAdd);
}

編集:正確には、これは私が得ているエラーです:

No matching conversion of static_cast from 'cBaseClassPtr' (aka 'shared_ptr<cBaseClassPtr>') to 'cDerivedClassPtr' (aka 'shared_ptr<cDerivedClassPtr>');

ブーストのスマート ポインターの実装を使用していますboost::shared_ptr

4

2 に答える 2

0

ここで何をしようとしているのか、どのスマート ポインターの実装を使用しているのかを正確に知ることは困難です。

基本クラスがポリモーフィックでないのはなぜですか? もしそうなら、ある種の二重ディスパッチを使用して、適切なコレクションに追加することができます。

派生ごとに異なるベクトルがある場合、各派生クラスは、自分自身を追加することになっているベクトルを認識します。

基本クラスが enable_shared_From_this から派生する必要があるため、それが既に現在 shared_ptred である場合 (おそらくそうである)、それ自体を共有ポインターにすることができます。最初のものをコレクションに入れます。

(それはブーストを使用していると仮定しており、stdには同じインターフェースがあると思います)

于 2013-04-12T11:57:03.780 に答える
0

CDerivedClass::AddComponent関数が実際に s しか処理できない場合cDerivedClassPtrは、それに応じて署名を調整します。

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)

を処理できる場合はcBaseClassPtr、 の定義をsvDerivedPtrListを保持するように調整します。cBaseClassPtr

std::vector<cBaseClassPtr> vBasePtrList;
于 2013-04-12T11:42:39.357 に答える