Оператор перегрузки [] - PullRequest
1 голос
/ 27 декабря 2010

У меня есть задача написать матрицу классов в C ++, и есть условие переопределить оператор [] для матрицы, поэтому, если у меня есть матрица с именем Matrix с этим «Matrix [0] [0]», я должен возьмите его первый элемент, на его первой строке. Я представил матрицу с двумерным динамическим массивом и шаблонами (матрица T **). Не могли бы вы помочь мне, пожалуйста?

PS: этот метод я использую для создания двумерного массива:

template <class T>
T ** Matrix<T>::createMatrix(unsigned int rows, unsigned int cols)
{
    T** matrix = new T*[rows];
    for (unsigned int i = 0; i < rows; i++) {

        matrix[i] = new T[cols];

    }
    return matrix;
}

Ответы [ 5 ]

2 голосов
/ 27 декабря 2010

Я предполагаю, что матрица - это переменная-член типа T ** матрицы.

template< class T >
T* operator []( Matrix<T>& m, unsigned int row )
{
  // maybe remember rows and assert(row<rows);
  return m.matrix[ row ];
}

Теперь вы можете написать что-то вроде

Matrix<T> m(50,9999);
m[42][1337]; 

для доступа к элементу 1337 в строке 42.

1 голос
/ 27 декабря 2010

То, что вы хотите сделать, это вернуть оператор T * in [], так как тогда к нему можно применить оператор [] и получить желаемый результат.Тем не менее, я хочу отметить, что оставлять указатели необработанными - довольно плохая практика.

1 голос
/ 27 декабря 2010

Вы можете сделать это с двумя классами. Класс матрицы переопределяет [] и возвращает объект строки. Объект строки переопределяет [] и возвращает скаляр.

0 голосов
/ 27 декабря 2010

Метод, который вы используете для создания матрицы, не имеет никакого отношения к классу, как утверждают ваши требования. Вы создаете простой T**, не имеет значения, что вы делаете это в методе класса.

Создание матрицы T, которую можно использовать как в matrix[i][j], означает, что выражение matrix[i] должно возвращать тип, для которого также определен оператор [] для возврата T. Поэтому обычный способ сделать это - разбить его на шаги:

  • Matrix<T> operator[] (int) возвращает MatrixRow<T>&
  • MatrixRow<T>& operator[] (int) возвращает T&

Будут также const версии этих операторов, которые будут использоваться при чтении значений из матрицы (неконстантные версии будут использоваться при записи в матрицу).

Итак, как минимум, вы должны создать класс с этим интерфейсом:

template <typename T>
class Matrix {
    public:
        Matrix(int rows, int cols);

        const MatrixRow<T>& operator[] (int row) const;
        MatrixRow<T>& operator[] (int row);
}

PS: Это читается как домашнее задание, не так ли?

0 голосов
/ 27 декабря 2010

Вы не можете сделать это изначально в C ++, но вы можете просто создать свою матрицу следующим образом:

Matrix<Matrix<int>> m;

Таким образом, первый [] возвращает другую матрицу, которая вернет нужный элемент.Конечно, гораздо лучшим названием для вашего класса будет Vector, а класс-оболочка Matrix создает внутренний Vector<Vector<T>>.

.
...