半只读的矩阵:实现迭代器反引用

时间:2019-01-20 16:06:21

标签: c++ iterator const

我有这个向量类(使用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中的方法,该方法没有考虑范围。我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想你是说:

 return const_cast<MyMat<T>&>(*matrix)[row][column];

也就是说,您的()放在错误的位置,您投下的时机已经太晚了。

但是,这种设计看起来极其脆弱,并且可能存在危险。我强烈建议您重新考虑您的目标。