3

我有这样的事情:

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>

4

3 回答 3

4

weak_ptr<A>从to直接转换weak_ptr<B>肯定行不通,我认为您必须将其转换为 ashared_ptr然后使用 shared_ptr 的转换功能:

weak_ptr<Food> food = myFoodFactory->createFood(eFruit)
weak_ptr<Fruit> fruit = weak_ptr<Fruit>(dynamic_pointer_cast<Fruit>(food.lock());
于 2011-02-10T14:07:30.767 回答
0

您不能使用dynamic_castwith,shared_ptr因为它需要更改对象的模板。实际上你想要做的是一个dynamic_cast内部指针。为此,您可以dynamic_cast对由返回的指针执行 a 操作,get但这不会那么干净,因为引用不会被共享(在您的情况下不相关,因为您正在使用weak_ptr但在使用时相关shared_ptr)并在此创建 share_ptr 将是未定义的导致双重删除。

用于dynamic_pointer_cast执行此操作,但两种类型仍需关联。换句话说dynamic_cast<T*>(r.get()),需要很好地形成。

于 2011-02-10T14:05:47.923 回答
0

如果您没有绑定到多线程,您可以使用 BOOST_DISABLE_THREADS 来提高性能,请参阅https://stackoverflow.com/a/8966130/1067933

于 2012-01-23T00:42:28.677 回答