I am having a problem with overloading an operator within a class structure. Below is

the program that illustrates my problem. It defines a class Matrix, creates two matrices

and multiplies them.

I created two multiplication methods. The first is a straight function, the second uses

the overloaded * operator. The two methods produce different results.

The "multiply" function produces the correct output, but the overloaded * method does not.Code:`#include <fstream.h>`

class Matrix

{

private:

int ROWS, COLUMNS;

double *M;

public:

Matrix() { }; //default constructor

Matrix(int R, int C){ROWS=R; COLUMNS=C; M=new double[ROWS*COLUMNS];}; //constructor

~Matrix() {delete[] M;}; // destructor

int rows() {return ROWS;}

int cols() {return COLUMNS;}

void set(int R, int C) {ROWS=R; COLUMNS=C; M=new double[ROWS*COLUMNS];};

void m (int R, int C, double V) {M[R*COLUMNS+C]=V;};

double m (int R, int C) {return M[R*COLUMNS+C];};

void dump() {for (int r=0; r<ROWS; r++) {for (int c=0; c<COLUMNS; c++)

cout << M[r*COLUMNS+c]<< " "; cout << endl;};};

void dump(fstream &fout) {for (int i=0; i<(ROWS*COLUMNS); i++)

{fout << M[i]; if (i!=(ROWS*COLUMNS-1)) fout << ", ";};};

Matrix operator * (Matrix &);

};

Matrix Matrix::operator* (Matrix &B)

{

Matrix C;

double ans;

C.set(rows(), B.cols());

for (int r=0; r<rows(); r++)

for (int c=0; c<B.cols(); c++)

{

ans=0;

for (int i=0; i<cols(); i++)

ans=m(r,i)*B.m(i,c)+ans;

C.m(r,c,ans);

};

return(C);

};

void multiply(const Matrix &A, const Matrix &B, Matrix &C) //This Works!! Or at least seems to

{

double ans;

C.set(A.rows(), B.cols());

for (int r=0; r<A.rows(); r++)

for (int c=0; c<B.cols(); c++)

{

ans=0;

for (int i=0; i<A.cols(); i++)

ans=A.m(r,i)*B.m(i,c)+ans;

C.m(r,c,ans);

};

};

void main()

{

Matrix A(4,3);

Matrix B(3,6);

Matrix C;

A.m(0,0,11); A.m(0,1,12); A.m(0,2,13);

A.m(1,0,21); A.m(1,1,22); A.m(1,2,23);

A.m(2,0,31); A.m(2,1,32); A.m(2,2,33);

A.m(3,0,41); A.m(3,1,42); A.m(3,2,43);

B.m(0,0,11); B.m(0,1,21); B.m(0,2,31); B.m(0,3,41);B.m(0,4,51);B.m(0,5,61);

B.m(1,0,12); B.m(1,1,22); B.m(1,2,32); B.m(1,3,42);B.m(1,4,52);B.m(1,5,62);

B.m(2,0,13); B.m(2,1,23); B.m(2,2,33); B.m(2,3,43);B.m(2,4,53);B.m(2,5,63);

C=A*B;

A.dump(); cout << endl;

B.dump(); cout << endl;

C.dump(); cout << endl;

multiply(A,B,C);

A.dump(); cout << endl;

B.dump(); cout << endl;

C.dump(); cout << endl;

cout << "Done.\n";

}

That method produces:

This answer is mostly correct. Only the (0,0) cell is wrong, it should be 434.Code:`4.13e-306 794 1154 1514 1874 2234`

794 1454 2114 2774 3434 4094

1154 2114 3074 4034 4994 5954

1514 2774 4034 5294 6554 7814

I have no idea what's going wrong here, other than I am getting the wrong answer.

While I could just use the "multiply" function, I suspect that my problem here may be

more than just with the overloaded operator.

Most documentation examples don't seem to cover classes of matrices -- so I may

have errors on several levels here.

Any advice, or suggestions, will be greatly appreciated.

Thanks,

Tom