簡體   English   中英

什么時候使用共享指針向量,什么時候使用純對象向量?

[英]When would you use a vector of shared pointers and when would you use a vector of just plain objects?

我有一個快速的問題。

我前一段時間開始學習C ++,並且始終將向量與對象中的共享指針一起使用。 或至少是智能指針。

我目前正在編寫游戲,正在考慮為什么要使用智能指針。

假設我有一個Game類,並且有一個玩家向量。

我什么時候要為vector<Player> players選擇,什么時候要為vector<shared_ptr<Player>>

  1. 如果訪問實體的狀態而不是訪問向量,請使用shared_ptr 同樣,如果您進行事件循環,則發生諸如“玩家與其他實體碰撞”之類的事件。 您需要復制一個指針/引用,否則您將無法更改實體的狀態。

  2. 另一個重要的事情是,當實體死亡時,卻未處理與該實體的事件 ,因此將該實體從向量中刪除。 當您使用shared_ptr ,實體將繼續存在,直到刪除事件隊列中的事件。 當您將整個玩家存儲在矢量中時,如果矢量更改其大小,則存儲在事件對象中的指針將不再指向正確的實體。 使用shared_ptr ,即使向量中不再存在該實體,也可以正常使用該實體。 但是最好在事件中使用std::weak_ptr ,將其刪除,當實體失效時, weak_ptr可以檢查指針是否為懸空指針,這意味着實體已失效且無需處理任何事件。

  3. 使用實體的向量所處的級別/維度 :當某個實體轉到另一個級別時,需要將實體移動到該級別,復制整個結構不是最好的主意。 因此,最好的辦法是使用諸如shared_ptr之類的指針類型,但是我建議使用std::move shared_ptr來減少引用計數的開銷。 使用std::move ,shared_ptr與原始ptr一樣快。

  4. 實體的虛擬類 :在2D或3D世界中編寫游戲時,要在向量中存儲許多不同種類的實體,必須使用某種指針類型來引用該對象,因為實體的大小可能不同。

  5. 固定玩家人數 :如果您要編程的游戲具有固定的玩家人數(例如紙牌游戲),則不要移動該玩家,也不要刪除該玩家(但是,您可以設置一個標志來表明該玩家已經死亡,而您不需要從向量中刪除實體),最好的方法是使用std::vector<Player>

我認為,使用位於向量中的shared_ptr並在事件中引用weak_ptr是管理實體的最佳方法。 盡管weak_ptr (較快的方法)不能使實體的內存保持活動狀態,但每次都需要檢查指針。

一些偽代碼

if(fixed count of players
            && there are no other entities
            && there are no virtual subclasses of Player) {
    class Player { ... };

    using player_collection = std::vector<Player>;
    using reference_to_player = Player*;
} else {
    class Entity { public: ... virtual ~Entity(); };
    class Player: public Entity { ... };

    using entity_collection = std::vector<std::shared_ptr<Entity>>;
    using reference_to_entity = std::weak_ptr<Entity>;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM