【发布时间】: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.x 和 object.y 的类型为 int,new_x 和 new_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<bool>(10)) { }
标签: c++ c++11 vector operator-keyword stdvector