gpt4 book ai didi

boost - C++ boost::shared_ptr & boost::weak_ptr & dynamic_cast

转载 作者:行者123 更新时间:2023-12-01 13:02:51 34 4
gpt4 key购买 nike

我有这样的东西:

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>如果我知道它指向的对象是派生类型?

最佳答案

直接类型转换自 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());

关于boost - C++ boost::shared_ptr & boost::weak_ptr & dynamic_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957896/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com