Перегрузка оператора 2D-массива и исключение

Я думал об этом и ничего полезного не придумал. У меня матрица представлена ​​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;

поэтому он может генерировать исключения с информацией об обоих индексах, независимо от того, какой из них неправильный. Я также хочу сделать это как можно более простым. Вы можете думать о чем-нибудь?

0

Решение

Ваш CMatrixRow должен быть в состоянии выяснить, какая строка находится в вашем контейнере. Один из простых способов сделать это — дать CMatrixRowКонструктор — дополнительный параметр, который является индексом строки, который он может сохранить после создания. Тем не менее, это форма избыточности и может привести к проблемам, если вы начнете двигаться CMatrixRowвокруг.

Обычно матричный доступ реализуется с помощью operator() принимая два аргумента вместо этого operator[] с помощником класса. Так что вместо matrix[i][j]вы бы сделали matrix(i, j), Это значительно облегчает вашу проблему и может также привести к увеличению производительности. Увидеть «Почему интерфейс моего класса Matrix не должен выглядеть как массив массивов?» для дополнительной информации.

1

Другие решения

В конце концов мне удалось сделать это так

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;
...
};

Я в основном скопировал это: Перегрузка оператора [] []

0

По вопросам рекламы [email protected]