Перегрузка операторов класса шаблона C ++ - PullRequest
0 голосов
/ 01 февраля 2020

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

Мой класс выглядит так:

template<class type = int>
    class matrix{
    private:
        int WIDTH, HEIGHT;
        int ROWS, COLS;
        type* array;
}

Конструктор:

template<class type>
matrix<type>::matrix() : WIDTH(0), HEIGHT(0), ROWS(0), COLS(0), array(nullptr) {}

Конструктор копирования:

template<class type>
matrix<type>::matrix(const matrix& matrixObj) : WIDTH(matrixObj.WIDTH), COLS(matrixObj.WIDTH), HEIGHT(matrixObj.HEIGHT), ROWS(matrixObj.HEIGHT), array(matrixObj.array){}

Деструктор:

template<class type>
matrix<type>::~matrix(){
    WIDTH = COLS = 0;
    HEIGHT = ROWS = 0;
    delete[] array;
}

= оператор

template<class type>
matrix<type>& matrix<type>::operator=(matrix matObj) noexcept {
    swap(*this, matObj);
    return *this;
}

+= оператор

template<class type>
matrix<type>& matrix<type>::operator+=(const matrix& matObj) {
    if (matObj.WIDTH != this->WIDTH || matObj.HEIGHT != this->HEIGHT)
        throw std::runtime_error("Both matrices must have same dimensions!");

    for (int i = 0; i < WIDTH * HEIGHT; i++)
        array[i] += matObj.array[i];
    return *this;
}

+ оператор

template<typename type>
matrix<type> operator+(matrix<type> lhs, matrix<type>& rhs){
    return lhs += rhs;
}

Когда я пытаюсь запустить код ниже:

matrix<int> mat1(2, 3), mat3(2, 5), mat2;
mat2 = mat1 + mat3;

Возвращает случайное значение мусора для mat1 и mat2.

Как это исправить?

РЕДАКТИРОВАТЬ

Я реализовал перегруженный конструктор, который выглядит следующим образом:

template<class type>
matrix<type>::matrix(int size, type values = 0) : WIDTH(size), HEIGHT(size), ROWS(size), COLS(size) {
    int iter = size * size;
    delete[] array;
    this->array = new type[iter];
    while (iter--)
        array[iter] = values;
}

1 Ответ

1 голос
/ 01 февраля 2020

Вы не инициализируете массив где-либо, кроме nullptr, поэтому любое использование array вызывает неопределенное поведение.

Ваш конструктор копирования должен копировать массив, а не просто копировать указатель.

Самое простое решение всего этого - просто использовать std::vector:

template<class type = int>
    class matrix{
    public:
        matrix() : WIDTH(0), HEIGHT(0), ROWS(0), COLS(0) {}
    private:
        int WIDTH, HEIGHT;
        int ROWS, COLS;
        std::vector<type> array;
};

Выше не требуется конструктор копирования, оператор присваивания или деструктор, так как значения, заданные компилятором по умолчанию, делают правильная вещь.

...