C ++ boost :: shared_ptr& boost :: 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();
}
现在我想更改我的应用程序以使用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<Food>
中得到一个
weak_ptr<Fruit>
?     
已邀请:
weak_ptr<A>
到ѭ5的直接投射肯定不起作用,我认为你必须将其转换为
shared_ptr
然后使用shared_ptr的强制转换功能:
weak_ptr<Food> food = myFoodFactory->createFood(eFruit)
weak_ptr<Fruit> fruit = weak_ptr<Fruit>(dynamic_pointer_cast<Fruit>(food.lock());
    
您不能将
dynamic_cast
shared_ptr
一起使用,因为它需要更改对象的模板。实际上你想做的是内部指针上的
dynamic_cast
。要做到这一点,你可以对
get
返回的指针执行
dynamic_cast
但是这不会那么干净,因为引用不会被共享(因为你在使用
weak_ptr
时无关紧要,但在使用ѭ6时相关)并创建了一个share_ptr这将是未定义的,导致双重删除。 使用
dynamic_pointer_cast
执行此操作但这两种类型仍需要相关。换句话说,
dynamic_cast<T*>(r.get())
需要很好地形成。     
如果您不受多线程的约束,可以使用BOOST_DISABLE_THREADS来提高性能,请参阅https://stackoverflow.com/a/8966130/1067933     

要回复问题请先登录注册