C++ 保持常量的指针向量
对于一个游戏,我有一个玩家类,该类保存对玩家当前拥有的所有仓库的引用。所有动作都是通过多人游戏的GameCommands执行的 现在,AI玩家可以访问世界,因此该玩家是只读的,这样就不会意外地修改任何导致不同步的内容。因此,当前播放器的外观如下所示:C++ 保持常量的指针向量,c++,pointers,vector,boost,c++03,C++,Pointers,Vector,Boost,C++03,对于一个游戏,我有一个玩家类,该类保存对玩家当前拥有的所有仓库的引用。所有动作都是通过多人游戏的GameCommands执行的 现在,AI玩家可以访问世界,因此该玩家是只读的,这样就不会意外地修改任何导致不同步的内容。因此,当前播放器的外观如下所示: class Player{ public: std::vector<Warehouse*>& getWarehouses(){return warehouses;} const std::vector<
class Player{
public:
std::vector<Warehouse*>& getWarehouses(){return warehouses;}
const std::vector<Warehouse*>& getWarehouses() const {return warehouses;}
};
职业玩家{
公众:
std::vector&getWarehouses(){return warehouses;}
const std::vector&getWarehouses()const{return warehouses;}
};
所以现在世界控制器(gamecommand)可以修改仓库,但人工智能不能。问题是:它不能修改容器,但可以修改包含的元素,这是一个接口问题
所以我遇到了boost::ptr_vector
,它似乎解决了这个问题:存储指针,但如果容器是常量,则所有访问器都返回常量引用,如果容器不是常量,则返回引用。这听起来很理想,但不适用于我的情况:玩家只持有对世界拥有的建筑物的引用。所以它不能删除它们
有没有一种零开销的方法来获取std::vector的const视图,或者告诉boost vector不要删除它的项?它需要很快,因为这样的情况在整个代码中的不同位置发生,所以它将被经常使用。这样做很容易,一定是以前做过
进一步限制:仅限C++03有一个CloneAllocator
视图\u clone\u分配器
,它完全执行所需的操作:复制只复制指针,删除不执行任何操作。所以我们需要做的就是将这些容器存储为boost::ptr_vector
,就这样
参考资料:Lol。。仅限C++03??为什么?是时候升级了。在任何情况下,您不能返回一个指向向量常量元素的常量指针,而不是向量的引用和常量引用(copy)吗??另外,让一个类成为朋友,并让它使用“私有”访问器(non-const-ref或ptr)怎么样。。所有其他类只能访问“public”访问器(const-ref或const-ptr)。这就是为什么C++03。我真的不想使用
friend
或原始指针,因为封装和安全性(向量在调试模式下有用于范围检查的断言等)我可能误解了你的问题,但我觉得你在错误的级别上解决了这个问题。听起来你在试图使用语言功能来解决什么是应用程序逻辑?比如:如果传入的类型是Meh
,而所有其他类都得到一个副本,那么它将启用一个函数。。