我有这个向量类(使用std :: vector),在其中定义了最小和最大之间的可访问元素范围
template <typename T>
class MyVec {
vector<T> vec;
int rangemin;
int rangemax;
//All kinds of methods
const T& operator[](int i) const {
//Conditions on i, ~NOT TAKING INTO CONSIDERATION RANGE~ and throwing exception
return static_cast<const T&>(vec[i]);
}
T& operator[](int i) {
//Conditions on i, ~TAKING INTO CONSIDERATION RANGE~ and throwing exception
return vec[i];
}
};
然后,我使用此类定义一类矩阵,其中某些元素是只读的(通过设置每行的范围)
template <typename T>
class MyMatrix {
vector<MyVec<T>> arr;
size_t rows, columns;
bool isUpper;
//All kinds of methods
MyVec<T>& operator[](int row) {
//Checking conditions on row and throwing exception
return arr[row];
}
MyVec<T> const& operator[](int row) const {
//Checking conditions on row and throwing exception
return arr[row];
}
class iterator;
}
现在,当我尝试通过m[i][j] = val
写入非法元素时,此机制实际上起作用了
但是当我实现以下迭代器
class MtmMat<T>::iterator {
const MyMat<T>* mat;
int row, column;
friend class MyMat<T>;
//Some methods
public:
T& operator*() {
return const_cast<T&>((*matrix)[row][column]);
}
T const& operator*() const {
return (*matrix)[row][column];
}
};
当我有一个指向应该只读的元素的迭代器时,可以写入!由于某些原因,它采用了MyVec
中的方法,该方法没有考虑范围。我该如何解决?
谢谢!
答案 0 :(得分:0)
我想你是说:
return const_cast<MyMat<T>&>(*matrix)[row][column];
也就是说,您的()
放在错误的位置,您投下的时机已经太晚了。
但是,这种设计看起来极其脆弱,并且可能存在危险。我强烈建议您重新考虑您的目标。