Почему массив изменяется?

class MatrixClass
{
	private:
		int **Matrix;
		int SizeM;
	public:
		MatrixClass(int);
		MatrixClass(){};
		~MatrixClass();

		int GetSize();
		void PrintMatrix();

		friend MatrixClass* operator+ (MatrixClass A, MatrixClass B);
		friend MatrixClass* operator- (MatrixClass A, MatrixClass B);
		// friend MatrixClass* operator* (MatrixClass A, MatrixClass B);
		// friend MatrixClass* operator/ (MatrixClass A, MatrixClass B);
}

MatrixClass::MatrixClass(int SizeM)
{
	this->SizeM = SizeM;
	Matrix = new int *[SizeM];
    for(int i = 0; i < SizeM; i++)
    {
        Matrix[i] = new int [SizeM];
        for(int j = 0; j < SizeM; j++)
            Matrix[i][j] = rand() % 5;
    }
}

MatrixClass::~MatrixClass()
{
	for(int i = 0; i < SizeM; i++)
	{
	    delete [](Matrix[i]);
	}
	delete [](Matrix);
}

int MatrixClass::GetSize(){return SizeM;}

void MatrixClass::PrintMatrix()
{
	for(int i = 0; i < SizeM; i++){
		cout << "\t| ";
        for(int j = 0; j < SizeM; j++)
            cout << Matrix[i][j] << " ";
        cout << "|" << endl;
	}
};

MatrixClass* operator+ (MatrixClass A, MatrixClass B)
{
	MatrixClass* C = new MatrixClass(A.GetSize());

	for(int i = 0; i < A.GetSize(); i++){
        for(int j = 0; j < A.GetSize(); j++){
            C->Matrix[i][j] = A.Matrix[i][j] + B.Matrix[i][j];
        }
	}

	return C;
}

MatrixClass* operator- (MatrixClass A, MatrixClass B)
{
	MatrixClass* C = new MatrixClass(A.GetSize());

	for(int i = 0; i < A.GetSize(); i++){
        for(int j = 0; j < A.GetSize(); j++){
            C->Matrix[i][j] = A.Matrix[i][j] - B.Matrix[i][j];
        }
	}

	return C;
}

void main()
{
	clrscr();
	
	// 4, 10
	MatrixClass A(3), B(3), *C;

	cout<<"A: "<<endl; A.PrintMatrix(); getch();
	cout<<"B: "<<endl; B.PrintMatrix(); getch();

	C = A + B;
	cout<<"A + B: "<<endl;
	C->PrintMatrix(); getch();

	cout<<"A: "<<endl; A.PrintMatrix(); getch();
	cout<<"B: "<<endl; B.PrintMatrix(); getch();

	C = A - B;
	cout<<"A - B: "<<endl;
	C->PrintMatrix(); getch();

	// C = A * B;
	// cout<<"Overload C = A + B: ";
	// C.PrintMatrix(); getch();

	// C = A / B;
	// cout<<"Overload C = A - B: ";
	// C.PrintMatrix(); getch();
}


Есть такой код, я не понимаю почему сбиваются массивы А и B, хотя я их даже не изменяю. Изменяются 2 первые строчки массива А и B. Подскажите в чем проблема

5cf3ed3386978140903346.png
  • Вопрос задан
  • 165 просмотров
Решения вопроса 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Операторы + и - принимают объекты по значению, а не по ссылке. Вероятно проблема в этом.
Ответ написан
@yevgenyyakushov Автор вопроса
Было
friend MatrixClass* operator+ (MatrixClass A, MatrixClass B);
//...
MatrixClass* operator+ (MatrixClass A, MatrixClass B)
{
	//...
}


Стало
friend MatrixClass* operator+ (MatrixClass& A, MatrixClass& B);
//...
MatrixClass* operator+ (MatrixClass& A, MatrixClass& B)
{
	//...
}


Профит
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы