|
ex6-7.cpp - Example 6-7 Operator overloading - Matrix arithmetic |
// File: ex6-7.cpp
#include <iostream>
#include <cstdlib>
using namespace std;
class Matrix
{
private:
int** element;
int rows;
int cols;
void alloc(void);
void release(void);
public:
Matrix(int, int);
Matrix(const Matrix&); // copy constructor
~Matrix();
void print(void);
Matrix operator+(const Matrix&);
Matrix& operator=(const Matrix&);
};
Matrix::Matrix(int r, int c)
{
cout << "Constructor called for object " << this <<endl;
rows = r;
cols = c;
alloc();
// initialize Matrix elements with random numbers 0-9
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++) element[i][j] = rand()%10;
}
Matrix::Matrix(const Matrix& arg)
{
cout << "\nIn copy constructor for object " << this;
cout << ", argument: " << &arg << endl;
rows = arg.rows;
cols = arg.cols;
alloc();
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++) element[i][j] = arg.element[i][j];
}
Matrix::~Matrix(void)
{
cout << "\n~~ Destructor called for object: " << this << endl;
release();
}
void Matrix::alloc(void) // allocate heap memory for elements
{
cout << "Allocate heap memory for Matrix " << this << " elements\n";
element = new int*[rows];
for (int i = 0; i < rows; i++)
element[i] = new int[cols];
}
void Matrix::release(void)
{
cout << "I got rid of Matrix " << this << "'s elements\n";
for (int i = 0; i < rows; i++) delete [] element[i];
delete [] element;
}
void Matrix::print(void)
{
cout << "\nMatrix values for object: "<< this << endl;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++) cout << element[i][j] << '\t';
cout << endl;
}
return;
}
Matrix Matrix::operator+(const Matrix& arg)
{
cout << "\nExecuting operator+ for object: " << this;
cout << ", argument: " << &arg << endl;
if (rows != arg.rows || cols != arg.cols)
{
cerr << "Invalid Matrix addition\n";
return (*this);
}
Matrix temp(rows,cols);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
temp.element[i][j] = element[i][j] + arg.element[i][j];
temp.print();
return temp;
}
Matrix& Matrix::operator=(const Matrix& arg)
{
cout << "\nExecuting operator= for object: " << this;
cout << ", argument: " << &arg << endl;
for (int i = 0; i < arg.rows; i++)
for (int j = 0; j < arg.cols; j++)
element[i][j] = arg.element[i][j];
return *this;
}
int main(void)
{
Matrix a(2,2),b(2,2),c(2,2);
a.print();
b.print();
c = a + b;
c.print();
return 0;
}
CIS27: Programming in C++ Instructor: Joe Bentley