оператор перегрузки многомерного массива для вектора - PullRequest
0 голосов
/ 01 мая 2020

Привет, я пытаюсь создать матричный класс, и я хочу назначить как матрица [0] [2] = 3 Я проверил форму и нашел решение с массивом, но я хочу сделать с вектором и не мог понять, почему это не так работает ?

 template<class T>
class Matrix
{
public:
    Matrix(int a, int b)
    {
        vector<vector<T> > vec( a , vector<T> (b, 0));
        matrixData = vec;
    }
    class Array1D
    {
    public:
        Array1D(vector<T> a):temp(a) {}
        T& operator[](int a)
        {
            return temp[a];
        }
        vector<T> temp;
    };

    vector<vector<T> > matrixData;
    Array1D operator[] (int a)
    {
        return Array1D(matrixData[a]);
    }
};

int main()
{
    Matrix<int> n(3,5);
    n[0][2] = 123; //assign

    cout<<n[0][2]; // wrong output getting 0
}

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Вы должны изменить реализацию Array1D на:

class Array1D
{
public:
    Array1D(vector<T>& a):temp(a) {}
    T& operator[](int a)
    {
        return temp[a];
    }
    vector<T>& temp;
};

без этого, каждый раз, когда вы вызываете operator[] для матрицы, вы получаете доступ к временному вектору. Следовательно, каждый вызов n[0] работает на разных векторах. Таким образом, любые предыдущие изменения не могут быть сохранены, и вы всегда видите 0 в качестве результата.

С этим изменением вы получаете доступ к исходному вектору матрицы с помощью Array1D прокси-класса.

Демо

1 голос
/ 01 мая 2020

Вы возвращаете неправильный тип из Matrix::operator[]. Вам нужно вернуть вложенный вектор по ссылке, чтобы вы могли связать с ним следующие []:

vector<T>& operator[] (int a)
{
   return matrixData[a];
}

На самом деле вам вообще не нужен внутренний класс Array1D для этого цель, поскольку vector уже имеет operator[], и вы можете удалить его полностью.

Вот рабочая демоверсия .

...