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 を使用し、食品インスタンスを 1 か所で削除できるようにします。次のようになります。

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 で動作しないように見えることです

オブジェクトが指すオブジェクトが派生型であることがわかっている場合、 aweak_ptr<Fruit>からa を取得するにはどうすればよいですか?weak_ptr<Food>

4

3 に答える 3

4

weak_ptr<A>からへの直接キャストは確実に機能しません。それを に変換してから、 shared_ptr のキャスト機能を使用weak_ptr<B>する必要があると思います。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

マルチスレッドに縛られていない場合は、BOOST_DISABLE_THREADS を使用してパフォーマンスを向上させることができます。https://stackoverflow.com/a/8966130/1067933 を参照してください。

于 2012-01-23T00:42:28.677 に答える
0

オブジェクトのテンプレートを変更する必要があるため、dynamic_castwithは使用できません。shared_ptr実際にやりたいことはdynamic_cast、内部ポインタに対するものです。これを行うdynamic_castには、によって返されたポインターに対して a を実行できますgetが、参照が共有されないため (を使用しているため、あなたの場合は無関係ですが、を使用weak_ptrする場合は関連しますshared_ptr)、これに share_ptr を作成することは未定義になるため、それほどクリーンではありません。二重削除になります。

を使用dynamic_pointer_castしてこれを行いますが、2 つのタイプを関連付ける必要があります。言い換えればdynamic_cast<T*>(r.get())、よく形成されている必要があります。

于 2011-02-10T14:05:47.923 に答える