Я думал об этом и ничего полезного не придумал. У меня матрица представлена 2 классами:
class CMatrix {
public:
CMatrixRow * matrix;
int height, width;
CMatrix(const int &height, const int &width);
CMatrix(const CMatrix &other);
~CMatrix();
CMatrixRow operator [] (const int &index) const;
...
}
class CMatrixRow {
public:
int width;
CMatrixRow(const int &width);
CMatrixRow(const CMatrixRow &other);
~CMatrixRow();
double operator [] (const int index) const;
void operator =(const CMatrixRow &other);
private:
double * row;
};
где CMatrix — это контейнер для строк матрицы (CMatrixRow).
Мне нужно создать исключение, когда кто-то пытается получить доступ к матрице за ее пределами, или, другими словами, один из используемых индексов больше, чем размер матрицы. Проблема в том, что мне нужно как-то передать первый индекс в метод
double operator [] (const int index) const;
поэтому он может генерировать исключения с информацией об обоих индексах, независимо от того, какой из них неправильный. Я также хочу сделать это как можно более простым. Вы можете думать о чем-нибудь?
Ваш CMatrixRow
должен быть в состоянии выяснить, какая строка находится в вашем контейнере. Один из простых способов сделать это — дать CMatrixRow
Конструктор — дополнительный параметр, который является индексом строки, который он может сохранить после создания. Тем не менее, это форма избыточности и может привести к проблемам, если вы начнете двигаться CMatrixRow
вокруг.
Обычно матричный доступ реализуется с помощью operator()
принимая два аргумента вместо этого operator[]
с помощником класса. Так что вместо matrix[i][j]
вы бы сделали matrix(i, j)
, Это значительно облегчает вашу проблему и может также привести к увеличению производительности. Увидеть «Почему интерфейс моего класса Matrix не должен выглядеть как массив массивов?» для дополнительной информации.
В конце концов мне удалось сделать это так
class CMatrix {
public:
double ** matrix;
int height, width, throwFirstIndex;
class Proxy {
public:
Proxy(double * array, const int width, const int rowIndex, bool fail = false);
double & operator [] (const int &index) const;
private:
double * row;
int width, rowIndex;
bool fail;
};
CMatrix(const int &height, const int &width);
CMatrix(const CMatrix &other);
~CMatrix();
Proxy operator [] (const int &index) const;
...
};
Я в основном скопировал это: Перегрузка оператора [] []