【问题标题】:C++ boost::shared_ptr & boost::weak_ptr & dynamic_castC++ boost::shared_ptr & boost::weak_ptr & dynamic_cast
【发布时间】:2011-02-10 13:51:27
【问题描述】:

我有这样的事情:

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&lt;Food&gt; 中获得weak_ptr&lt;Fruit&gt;

【问题讨论】:

    标签: boost dynamic-cast weak-ptr


    【解决方案1】:

    直接从weak_ptr&lt;A&gt; 转换为weak_ptr&lt;B&gt; 肯定不行,我认为你必须将其转换为shared_ptr,然后使用shared_ptr 的转换功能:

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

    【讨论】:

      【解决方案2】:

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

      使用dynamic_pointer_cast 来执行此操作,但这两种类型仍然需要关联。换句话说,dynamic_cast&lt;T*&gt;(r.get()) 需要良好的格式。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 如果此问题与您链接的问题重复,请提供此链接以标记问题。
        猜你喜欢
        • 2011-04-22
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多