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