2014-01-23 136 views
2

我有一類設置類似於此:矢量參考對象?

class BlimpBase{ 
public: 
    virtual ~BlimpBase(); 

private: 
    virtual void lift()const = 0; 
}; 

class Blimp: protected BlimpBase{ 
    void lift()const; 
}; 

class BlimpCarrier{ 
public: 
    add_blimp(BlimpBase& blimp); 

private: 
    std::vector<BlimpBase* blimp> blimps; 
}; 

正如你所看到的,我有一組多態飛艇類的,我想,然後存儲通過使用指針在矢量「引用」(我意識到你不能在向量中存儲引用,我只是不知道如何描述它們)。問題在於大多數這些對象都是作爲類成員分配在堆棧上的,但我想將它們添加到這個向量中,以便我可以直接修改它們(副本不會)。保持指向這些對象的問題是,如果這些對象在BlimpCarrier之前超出範圍(因爲它們在堆棧中),我將會有一個懸掛指針。我看着std::unique_ptrstd::shared_ptr,但我認爲我不認爲我可以在這裏使用它們......

+0

只是不要在堆棧上分配它們。 –

+0

@PaulGriffiths:他們是類的成員,我想通過這個數組「引用」他們。我不認爲把它們放在堆上會幫助我解決任何問題 – Shokwav

+0

如果你將它們作爲shared_ptr放到類中,並通過shared_ptr或weak_ptr將它們引用到你的矢量中,它會對你有所幫助。 –

回答

0

假設你可以改變它們在堆棧中的分配位置或者它們作爲成員的類,那麼你可以嘗試這跟的std :: weak_ptr的:

class BlimpCarrier{ 
public: 
    add_blimp(std::shared_ptr<BlimpBase>& blimp_ptr) 
    { 
     blimps.push_back(blimp_ptr); 
    } 

private: 
    std::vector<std::weak_ptr<BlimpBase>> blimps; 
}; 

BlimpCarrier globalCarrier; 

void foo() 
{ 
    std::shared_ptr<BlimpBase> instance(new BlimpSubClass()); 
    globalCarrier.add_blimp(instance); 
} 

你需要一個額外的步驟,當你穿越你檢查weak_ptr對象已經「過期」或沒有,然後自己從載體中刪除的載體。我實際上建議使用std::list而不是這種類型的鏈接列表實現。有關如何正確安全地使用weak_ptr的示例,請參見cppreference.com

+1

對於額外的步驟,使用'std :: remove_if'和'.erase'。 – Griwes