2017-05-26 64 views
0

將子共享指針上傳到它的父共享指針的正確方法是什麼?我從蘋果去水果的評論部分是我不清楚的地方。將子shared_pointer投射到父shared_pointer C++ 14

class Fruit 
{ 
}; 

class Apple : public Fruit 
{ 
}; 

typedef std::shared_ptr<Fruit> FruitPtr; 
typedef std::shared_ptr<Apple> ApplePtr; 

int main() 
{ 
    ApplePtr pApple = ApplePtr(new Apple()); 

    FruitPtr pFruit = /* what is the proper cast using c++ 14 */ 
} 

回答

1

您可以使用std::static_pointer_cast,但這正是你想要的:

class Fruit { }; 
class Apple : public Fruit { }; 

int main() { 
    std::shared_ptr<Apple> pApple = std::make_shared<Apple>(); 
    std::shared_ptr<Fruit> pFruit = std::shared_pointer_cast<Fruit>(pApple) 
    return 0; 
} 

在旁註中,我會避​​免直接構建shared_ptr。這樣做或使用make_shared的折衷可在this cppreference.com page上閱讀。我也避免使用類型定義ApplePtrFruitPtr,因爲它可能會讓有人讀你的代碼時感到困惑,因爲沒有任何跡象表明它們是共享指針而不是原始指針。

1

你可以簡單地使用隱向上轉型:

FruitPtr pFruit = pApple 

如果您將添加斷點,你可以看到,這條線後,強引用計數器增加爲2(我以爲是你想什麼發生)。

無關的評論: 更喜歡make_shared使用過調用新的自己(讀Difference in make_shared and normal shared_ptr in C++至於爲什麼)

+0

很酷,謝謝你的補充信息。從C++ 98轉移到C++ 14 ---這是相當的變化 – pyInTheSky

+0

但是,我需要把孩子放入一個矢量,編譯器在抱怨---所以看起來我需要一個某種。 – pyInTheSky

+0

@pyInTheSky我希望你說的是'矢量'而不是'矢量' – Leonardo