Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保持常量的指针向量_C++_Pointers_Vector_Boost_C++03 - Fatal编程技术网

C++ 保持常量的指针向量

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<

对于一个游戏,我有一个玩家类,该类保存对玩家当前拥有的所有仓库的引用。所有动作都是通过多人游戏的GameCommands执行的

现在,AI玩家可以访问世界,因此该玩家是只读的,这样就不会意外地修改任何导致不同步的内容。因此,当前播放器的外观如下所示:

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
,而所有其他类都得到一个副本,那么它将启用一个函数。。