我有这样的事情:
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();
}
现在我想更改我的应用程序以使用boost shared_ptr和weak_ptr,以便我可以在一个地方删除我的食物实例。它看起来像这样:
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似乎不适用于weak_ptr
如果我知道它指向的对象属于派生类型,如何从weak_ptr<Fruit>
中获取weak_ptr<Food>
?
答案 0 :(得分:4)
从weak_ptr<A>
直接投射到weak_ptr<B>
肯定不起作用,我认为您必须将其转换为shared_ptr
,然后使用shared_ptr的强制转换功能:
weak_ptr<Food> food = myFoodFactory->createFood(eFruit)
weak_ptr<Fruit> fruit = weak_ptr<Fruit>(dynamic_pointer_cast<Fruit>(food.lock());
答案 1 :(得分:0)
您不能将dynamic_cast
与shared_ptr
一起使用,因为它需要更改对象的模板。实际上你想做的是内部指针上的dynamic_cast
。为此,您可以对dynamic_cast
返回的指针执行get
,但这不会太干净,因为不会共享引用(因为您使用{{1},因此无关紧要)但是在使用weak_ptr
时相关并且在此上创建share_ptr将是未定义的,从而导致双重删除。
使用shared_ptr
执行此操作,但这两种类型仍需要相关。换句话说,dynamic_pointer_cast
需要很好地形成。
答案 2 :(得分:0)
如果您不受多线程限制,可以使用BOOST_DISABLE_THREADS来提高性能,请参阅https://stackoverflow.com/a/8966130/1067933