【问题标题】:(Re)Assignment to a 2 dimensional std::vector<bool> within a private member function(重新)分配给私有成员函数中的二维 std::vector<bool>
【发布时间】:2016-12-07 00:20:06
【问题描述】:

当实现一个类时有一个内部对象:

std::vector<std::vector<bool>> a;

该类使用operator[] 初始化此对象以分配false

for(auto i = 0; i < limit; ++i) {
    for(auto j = 0; j < limit; ++j) {
        a[i][j] = false;
    }
}

在私有成员函数期间,我们更新此对象以反映当前状态,注意 object.xobject.y 的类型为 intnew_xnew_y 也是如此:

a[object.x][object.y] = false;
a[new_x][new_y] = true;

正在使用的对象类是:

class object {
public:
    object(): x(0), y(0) { }
    int x;
    int y;
};

为什么编译器允许初始化,然后说:

error: expression is not assignable

当我在私有成员函数中重新分配向量中的位时?

这是一个最小完整的可验证示例:

对象.hpp:

 #ifndef OBJECT_HPP
 #define OBJECT_HPP

 class Object {
 public:
     Object(): x(0), y(0) {}
     Object(int x, int y) : x(x), y(y) {}
     int x;
     int y;
 };
 #endif`

main.cpp

   #include "Object.hpp"
   #include <vector>

   class Function {

       public:
           Function() : a(10, std::vector<bool>(10)) { }

           void moveObjects() {
               for(int i = 0; i < 10; ++i) {
                   editObjects(i,i);
               }
           }

       private:
           void editObjects(int new_x, int new_y) const {
               a[new_x][new_y] = true;
            }


       std::vector<std::vector<bool>> a;
   };

   int main() {
       Function f;

       f.moveObjects();
   }

使用clang编译收到错误:

clang++-3.8 main.cpp -std=c++14

【问题讨论】:

  • 我们可以看到您的object 课程以及调用(您分配新值的位置)吗?也许有些东西需要设置为public?如果您认为问题出在选择auto,则将其更改为基本int 并尝试一下。
  • 还有,成员函数是const吗?
  • 基本上你需要创建一个minimal reproducible example
  • 您在哪个函数中进行初始化以及在哪个函数中发生错误?
  • 您的 Function 构造函数完全错误。您正在访问超出向量范围的元素。它应该是:Function() : a(10, std::vector&lt;bool&gt;(10)) { }

标签: c++ c++11 vector operator-keyword stdvector


【解决方案1】:

问题是私有成员函数被定义为const 将对象更改为mutable 解决了问题:

mutable std::vector<std::vector<bool>> a;

【讨论】:

  • 位向量被用作缓存,用于存储稍后必须更新和重新缓存的对象。这个对象不是世界的直接状态,只是在世界变化时用来记账,这让我相信mutable在这里是可以的。
  • 这样的话,mutable 的问题就更少了!请务必手动确保线程安全。
【解决方案2】:

你有:

void editObjects(int new_x, int new_y) const {
   a[new_x][new_y] = true;
}

这是不正确的,因为您现在可以在 const 成员函数中修改 a。从函数中删除 const 限定符。

void editObjects(int new_x, int new_y) {
   a[new_x][new_y] = true;
}

【讨论】:

    猜你喜欢
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2021-03-11
    • 2015-12-18
    相关资源
    最近更新 更多