2011-02-10 11 views
2

私はこのようなものがあります:Cは:: shared_ptrのを後押し&後押し++ :: weak_ptrを&dynamic_castを

enum EFood{ 
    eMeat, 
    eFruit 
}; 

class Food{ 
}; 

class Meat: public Food{ 
    void someMeatFunction(); 
}; 

class Fruit: public Food{ 
    void someFruitFunction(); 
}; 

class FoodFactory{ 
    vector<Food*> allTheFood; 
    Food* createFood(EFood foodType){ 
     Food* food=NULL; 
     switch(foodType){ 
      case eMeat: 
       food = new Meat(); 
       break; 
      case eFruit: 
       food = new Fruit(); 
       break; 
     } 
     if(food) 
      allTheFood.push_back(food); 
     return food; 
    } 
}; 

int foo(){ 
    Fruit* fruit = dynamic_cast<Fruit*>(myFoodFactory->createFood(eFruit)); 
    if(fruit) 
     fruit->someFruitFunction(); 
} 

を今、私は私は私の食品インスタンスを削除することができブーストのshared_ptrを使用して、このようなweak_ptrをする自分のアプリケーションを変更したいです1つの場所。それは次のようになります。

class FoodFactory{ 
    vector<shared_ptr<Food> > allTheFood; 
    weak_ptr<Food> createFood(EFood foodType){ 
     Food* food=NULL; 
     switch(foodType){ 
      case eMeat: 
       food = new Meat(); 
       break; 
      case eFruit: 
       food = new Fruit(); 
       break; 
     } 

     shared_ptr<Food> ptr(food); 
     allTheFood.push_back(ptr); 
     return weak_ptr<Food>(ptr); 
    } 
}; 

int foo(){ 
    weak_ptr<Fruit> fruit = dynamic_cast<weak_ptr<Fruit> >(myFoodFactory->createFood(eFruit)); 
    if(shared_ptr<Fruit> fruitPtr = fruit.lock()) 
     fruitPtr->someFruitFunction(); 
} 

が、問題はdynamic_castをiはオブジェクトが指していることを知っていれば、私はweak_ptr<Food>の外にweak_ptr<Fruit>を得るのですかweak_ptrを

で動作するようには思えないということです派生型のですか?

答えて

3

直接鋳造が確実に動作しないだろう、私はあなたがshared_ptrに変換し、その後のshared_ptrのキャスティング機能を使用するために持っていると思う:

weak_ptr<Food> food = myFoodFactory->createFood(eFruit) 
weak_ptr<Fruit> fruit = weak_ptr<Fruit>(dynamic_pointer_cast<Fruit>(food.lock()); 
0

dynamic_castshared_ptrと一緒に使用することはできません。オブジェクトのテンプレートを変更する必要があるためです。実際にあなたがしたいことは、内部ポインタにdynamic_castです。これを行うには、getによって返されたポインタ上のdynamic_castを実行できますが、参照が共有されない(weak_ptrを使用しているためあなたのケースでは無関係ですが、shared_ptrを使用しているので)これは定義されていないため、二重削除されます。

これを行うにはdynamic_pointer_castを使用しますが、まだ2つのタイプを関連付ける必要があります。言い換えれば、dynamic_cast<T*>(r.get())は整形式である必要があります。 weak_ptr<A>からweak_ptr<B>

0

あなたは、パフォーマンスを向上させるためにBOOST_DISABLE_THREADSを使用することができますhttps://stackoverflow.com/a/8966130/1067933

+0

この質問がリンク先と重複している場合は、このリンクに記載されているように質問にフラグを立ててください。 – BoltClock

関連する問題