對於一款遊戲,我有一個玩家類可以保存對遊戲的引用。玩家目前擁有的所有倉庫。所有動作都通過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只
洛爾.. C++ 03只??爲什麼???升級時間。在任何情況下,你都不能返回一個const指針給vector的const元素,而不是對vector和const引用(copy)的引用?另外,如何讓一個類成爲朋友,並使用「私人」訪問器(非const ref或ptr)..所有其他類將只能訪問「公共」訪問器(const ref或const ptr)。 – Brandon
例如:https://ideone.com/G9Cr0M – Brandon
我們使用蘋果交叉編譯器。那就是爲什麼C++ 03。我真的不想使用'朋友'或原始指針由於封裝和安全性(向量在調試模式下的範圍檢查等斷言) – Flamefire