I am trying to create a dynamic matrix template class. With my current knowledge of C ++, I managed to solve some problems, but I was stuck in the copy constructor and overloaded operator =; in other words, I cannot create copies of my objects. In my oppinion, this should work, but my friend, the compiler, tells me that I have 1 error: error: pass' const Matrix as' this argument 'int Matrix :: getElement (int, int) [with T = int] discards qualifiers [-fpermissive] on this line:
m[i][j] = original.getElement(i, j);
when i want to create an object:
Matrix<int> m = Matrix<int>(3, 3);
My template class is here:
template<class T>class Matrix { public: Matrix<T>(int lines, int columns) { this->lines = lines; this->columns = columns; T* aux = new T[this->lines * this->columns]; m = new T*[lines]; for (int i = 0; i < this->lines; i++) { m[i] = aux + (i * this->columns); } for (int i = 0; i < this->lines; i++) { for (int j = 0; j < this->columns; j++) { m[i][j] = 0; } } } Matrix<T>(const Matrix<T>& original) { columns = original.getColumns(); lines = original.getLines(); T* aux = new T[this->lines * this->columns]; m = new T*[lines]; for (int i = 0; i < lines; i++) { m[i] = aux + (i * this->columns); } for (int i = 0; i < lines; i++) { for (int j = 0; j < columns; j++) { m[i][j] = original.getElement(i, j); } } } virtual ~Matrix<T>() { delete [] m; } T** getPointer() { return m; } int getLines () const { return lines; } int getColumns () const { return columns; } int getElement(int line, int column) { return m[line][column]; } int setElement(int line, int column, T value) { m[line][column] = value; } Matrix<T>* getTranspose() { Matrix<T>* aux = new Matrix<T>(lines, columns); for (int i = 0; i < lines; i++) { for (int j = 0; j < columns; j++) { aux->setElement(i,j, m[j][i]); } } return aux; } Matrix<T> operator=(const Matrix<T> original) { columns = original.getColumns(); lines = original.getLines(); T* aux = new T[this->lines * this->columns]; m = new T*[lines]; for (int i = 0; i < lines; i++) { m[i] = aux + (i * this->columns); } for (int i = 0; i < lines; i++) { for (int j = 0; j < columns; j++) { m[i][j] = original.getElement(i, j); } } } friend std::ostream& operator<<(std::ostream& out, Matrix<T>& matrix) { out<<"Matrix:"<<std::endl; for (int i = 0; i < matrix.getLines(); i++) { for (int j = 0; j < matrix.getColumns(); j++) { out<<matrix.getElement(i, j)<<" "; } out<<std::endl; } return out; } friend std::istream& operator>>(std::istream& in, Matrix<T>& matrix) { std::cout << "Reading Matrix:\n"; for (int i = 0; i < matrix.getLines(); i++) { for (int j = 0; j < matrix.getColumns(); j++) { std::cout << "Matrix[" << i << "][" << j << "]:"; in >> matrix.m[i][j]; } std::cout << std::endl; } return in; } private: T** m; int lines; int columns; };
As I can understand from this error, I create 2 objects that refer to the same memory block, but I want to create 2 objects that refer to 2 different memory blocks with the same contents.
source share