Question

When I debug the following code, I am told that there is an access violation. I tried changing this->arr[i][j] in the assignment operator to *(this->arr[i][j]) but that didn't work either as I was told that it was an illegal indirection.

Header

#ifndef MATRIX_H
#define MATRIX_H
class Matrix
{
public:
    Matrix(int rSize=3, int cSize=3);
    Matrix(const Matrix& m);
    ~Matrix();
    bool setValue(int rSize, int cSize, int value);
    bool getValue(int rVal, int cVal, int& value)const;
    Matrix& operator= (const Matrix& m);

private:
    int rowSize;
    int columnSize;
    int** arr;
};

Source

#include<iostream>
#include<cmath>
#include"Matrix.h"
using namespace std;
Matrix::Matrix(int rSize,int cSize)
{
    columnSize = cSize;
    rowSize = rSize;
    arr = new int* [rowSize];
    for(int i=0; i<rowSize; i++)
        arr[i] = new int[columnSize];
    for(int j=0; j<rowSize; j++)
    {
        for(int k=0; k<columnSize; k++)
            arr[j][k] = 0;
    }

}
Matrix::Matrix(const Matrix& m)
{
    columnSize = m.columnSize;
    rowSize = m.rowSize;
    arr = new int* [rowSize];
    for(int i=0; i<rowSize; i++)
    {
        arr[i] = new int [columnSize];
    }
    for(int i=0; i<rowSize; i++)
    {
        for(int j=0; j<columnSize; j++)
            arr[i][j] = m.arr[i][j];
    }
}
Matrix::~Matrix()
{
    for(int i = 0; i < rowSize; ++i)
        delete [] arr[i];
    delete [] arr;
}
bool Matrix::setValue(int rVal, int cVal, int value)
{
    if((rVal<0)||(cVal<0)||(rVal>rowSize-1)||(cVal>columnSize-1))
        return false;
    arr[rVal][cVal] = value;
    return true;
}
bool Matrix::getValue(int rVal, int cVal, int& value)const
{
    if((rVal<0)||(cVal<0)||(rVal>rowSize-1)||(cVal>columnSize-1))
        return false;
    value = arr[rVal][cVal];
    return true;
}
Matrix& Matrix::operator= (const Matrix& m)
{
    if(&m == this)
        return(*this);
    if(((this->rowSize)!= m.rowSize) || ((this->columnSize) != m.columnSize))
    {
        for(int i=0; i<rowSize; i++)
            delete []arr[i];
        delete[]arr;
        rowSize = m.rowSize;
        columnSize = m.columnSize;
        arr = new int* [m.rowSize];
        for(int r=0; r<rowSize; r++);
    }
    for(int j=0; j<rowSize; j++)
    {
        for(int k=0; k<columnSize; k++)
            this->arr[j][k] = m.arr[j][k];
    }
    return(*this);
}

Driver

#include<iostream>
#include"Matrix.h"
using namespace std;
void main()
{
    Matrix m(4, 5);
    Matrix m2(m);
    m2.setValue(1,2,12);
    int x;
    m2.getValue(1,2,x);
    Matrix m3;
    m3 = m2;
}
Was it helpful?

Solution

Matrix& Matrix::operator= (const Matrix& m)

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

You forgot to allocate :

arr[r] = new int [columnSize];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top