Матрица, которая наполовину доступна только для чтения: реализация разыменования итератора - PullRequest
0 голосов
/ 20 января 2019

У меня есть этот векторный класс (с использованием std :: vector), в котором я определяю диапазон доступных элементов от min до max

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, но при реализации следующегоiterator

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 голосов
/ 20 января 2019

Полагаю, вы имели в виду:

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

То есть, ваш () находится в неправильном месте, и вы бросили слишком поздно.

Однако этот дизайн выглядит чрезвычайно хрупким и потенциально опасным,Я настоятельно рекомендую пересмотреть вашу цель.

...