2017-08-30 84 views
1

對於一款遊戲,我有一個玩家類可以保存對遊戲的引用。玩家目前擁有的所有倉庫。所有動作都通過GameCommands進行鎖步多人遊戲。保持常量的指針向量

現在,AI玩家可以訪問世界,因此玩家只讀,以免意外修改導致解除同步的任何內容。所以目前玩家看起來是這樣的:

class Player{ 
    public: 
    std::vector<Warehouse*>& getWarehouses(){return warehouses;} 
    const std::vector<Warehouse*>& getWarehouses() const {return warehouses;} 
}; 

所以現在世界控制器(gamecommand)可以修改倉庫但AI不行。那麼問題:它不能修改容器,但它可以修改所包含的元素,這是一個接口問題。

所以我碰到boost::ptr_vector這似乎解決了這個問題:存儲指針,但所有訪問器返回const引用,如果容器是const,並且引用它,如果它不是。這聽起來很理想,但不適合我的情況:玩家只持有對世界擁有的建築物的參考。所以它不能刪除它們。

是否有一種零開銷的方式來獲得std::vector的一種常量視圖或告訴boost向量不要刪除它的項目?它需要快速,因爲這樣的情況發生在整個代碼的不同位置,所以它會被經常使用。這樣做很容易,之前一定是這樣做的。

進一步的限制:C++ 03只

+0

洛爾.. C++ 03只??爲什麼???升級時間。在任何情況下,你都不能返回一個const指針給vector的const元素,而不是對vector和const引用(copy)的引用?另外,如何讓一個類成爲朋友,並使用「私人」訪問器(非const ref或ptr)..所有其他類將只能訪問「公共」訪問器(const ref或const ptr)。 – Brandon

+0

例如:https://ideone.com/G9Cr0M – Brandon

+0

我們使用蘋果交叉編譯器。那就是爲什麼C++ 03。我真的不想使用'朋友'或原始指針由於封裝和安全性(向量在調試模式下的範圍檢查等斷言) – Flamefire

回答