Tamara Caligari
Tamara Caligari

Reputation: 509

C++ matrix class template

I am coding a matrix template class and the problem I am having is that the array is created and the values are filled but when I use the print() function, the array is empty again. Could anyone perhaps indicate what I'm doing wrong please?

data is defined as such:

T **data; 


template<class T> 
CMatrix<T>::CMatrix( int rows, int cols)
{
setRow(rows);
setCol(cols);

data = new int*[rows];
// Create matrix with dimensions given

for (int i = 0; i < row; i++) {
    data[i] = new int [cols];
}

for(int i = 0; i < row; i++) {
    for(int j = 0; j < cols; j++) {
        data[i][j] = (int) i * j;
    }
}
}


template<class T> 
void CMatrix<T>::print()
{
int i,j;

for (i=0;i<4;i++)
{ 
for(j=0;j<4;j++)
{
    printf("%.1f    ",data[i][j]);
}
printf("\n");
}
}

Main function:

int main (){    

int rows =4;
int cols = 4;

CMatrix<int>* matrixOne= new CMatrix<int>(rows, cols);
matrixOne->print();

    return(0);
}

Declarations of template:

template<class T> 
class CMatrix

{
private:
    int row;  // number of rows
    int column;  // number of columns

public:     

    CMatrix(int rows, int cols);

    CMatrix(const CMatrix& data); //Copy constructor

    //Constructor taking an array of 16 elements
    CMatrix(T Matrix[16]);
    ~CMatrix();

    T **data; 
    void setRow(int r);
    void setCol(int c);
    int getRow();
    int getCol();

    //Subscript operators
    T& operator()(int row, int col);
    T operator()(int row, int col) const;
    void print();



};

Upvotes: 1

Views: 24438

Answers (1)

phyatt
phyatt

Reputation: 19112

I would make sure you are using your data variable and your row and column variables in a class. This is by no means the most complete version, but it compiles and runs fine.

Also make sure that you use "T" and not "int" in your constructor. See the comments.

Note the two comments in the print function about using row and col instead of hard coding the values.

#ifndef CMATRIX_H
#define CMATRIX_H

#include <stdio.h>

template <class T>
class CMatrix
{
public:
    CMatrix( int rows, int cols)
    {
        setRow(rows);
        setCol(cols);

        data = new T*[rows]; // replaced "int" for "T"

        for (int i = 0; i < row; i++) {
            data[i] = new T [cols]; // replaced "int" for "T"
        }

        for(int i = 0; i < row; i++) {
            for(int j = 0; j < cols; j++) {
                data[i][j] = (T) i * j; // replaced "int" for "T"
            }
        }
    }

    void print();
    void setRow(int r){row = r;}
    void setCol(int c){col = c;}
    T& operator()(int row, int col);
private:
    T **data;
    int row,col;
};

template <class T>
void CMatrix<T>::print ()
{
    int i,j;

    for (i=0;i < row;i++) // Here you used to have row hard coded to 4
    {
        for(j=0;j < col;j++) // Here you used to have col hard coded to 4
        {
            printf("%.1f    ",(float) data[i][j]);
        }
        printf("\n");
    }
}

// Recently added
template<class T> T& CMatrix<T>::operator()(int row, int col)
{
    return data[row][col];
}

#endif // CMATRIX_H

Here is the main.

#include "cmatrix.h"
#include <iostream>

int main(int argc, char *argv[])
{
    CMatrix <float> m(4,4);

    m.print();

    // Recently added
    std::cout << m(1,1);

    return 0;
}

Upvotes: 3

Related Questions