Проблема с операторами арифметики в классах
Пишу операторы арифметических выражений для массивов в классах. Цель: создать два экземпляра класса, ввести их размеры (они одинаковы), заполнить их случайными элементами, а третий создать и заполнить суммой двух первых. Проблема: при запуске кода второй массив заполняется мусором.
ДОП: Какие вы можете сделать замечания по поводу написания кода? Как можно улучшить написание? (Занимаюсь недолго, знаю очень мало, можете дать онлайн-ресурсы с информацией)
Спасибо
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...
Основываясь на комментариях, получилось так:
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)