Проблема с операторами арифметики в классах

Рейтинг: -1Ответов: 2Опубликовано: 25.04.2023

Пишу операторы арифметических выражений для массивов в классах. Цель: создать два экземпляра класса, ввести их размеры (они одинаковы), заполнить их случайными элементами, а третий создать и заполнить суммой двух первых. Проблема: при запуске кода второй массив заполняется мусором.

ДОП: Какие вы можете сделать замечания по поводу написания кода? Как можно улучшить написание? (Занимаюсь недолго, знаю очень мало, можете дать онлайн-ресурсы с информацией)

Спасибо


class MATRIX{
private:
    int* array;
    int size;
public:
    MATRIX(){
        cout << "Constructor: " << this << endl;
        this->array = new int[size];
        for (int i = 0; i < this->size; i++){
            this->array[i] = rand() % 10;
        }
    }
    void set(int Valuesize){
        size = Valuesize;
    } // Установка размера массива

    MATRIX operator + (const MATRIX& other){
        MATRIX temp;
        for (int i = 0; i < this->size; i ++){
            temp.array[i] = this->array[i] + other.array[i];
        }
        return temp;
    }
    void print(){
        for (int i = 0; i < this->size; i++){
            cout << this->array[i] << " ";
        }
        cout << endl;
    } // Вывод массива

    ~MATRIX(){
        cout << "Destructor: " << this << endl;
        delete[] array;
    }
};

int main(){
    int size;
    cout << "Введите размер матрицы: ";
    cin >> size;

    MATRIX first;
    first.set(size);

    MATRIX second;
    second.set(size);

    MATRIX third = first + second;
    third.set(size);


    first.print();
    cout << "-------------------------------" << endl;
    second.print();
    cout << "-------------------------------" << endl;
    third.print();

    return 0;
}

Ответы

▲ 2

Смотрите, что вы делаете:

MATRIX first;
first.set(size);

Итак, в первой строке создана матрица (вызван конструктор)

MATRIX(){
    cout << "Constructor: " << this << endl;
    this->array = new int[size];
    for (int i = 0; i < this->size; i++){
        this->array[i] = rand() % 10;
    }
}

Для какого значения size вы вызываете new? Для того, которое случайно оказалось в памяти... Потому что устанавливаете это значение вы только во второй строчке

first.set(size);

Какой теперь в этом смысл?

Так что говорить о том, что происходит какая-то конкретная неприятность, просто не приходится, потому что у вас типичное неопределенное поведение, так что программа может вообще делать, что захочет...

Все остальное даже не смотрел. Кстати, в операторе сложения вы для temp размер не указываете даже post factum...

▲ 0

Основываясь на комментариях, получилось так:

MATRIX(int size) {
    cout << "Constructor: " << this << endl;
    this->size = size;
    this->array = new int[this->size];
    for (int i = 0; i < this->size; i++) {
        this->array[i] = rand() % 10;
    }
}
MATRIX operator + (const MATRIX& other) {
    MATRIX temp(size);
    for (int i = 0; i < this->size; i++) {
        temp.array[i] = this->array[i] + other.array[i];
    }
    return temp;
}

Всё работает, спасибо Harry)