2012-05-26 2 views
1

Я кодирую класс шаблона матрицы, и проблема, с которой я сталкиваюсь, заключается в том, что массив создан и значения заполняются, но когда я использую функцию print(), массив снова пуст. Может ли кто-нибудь, возможно, указать, что я делаю неправильно, пожалуйста?Шаблон класса матрицы C++

данных определяются как таковую:

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"); 
} 
} 

Основной функция:

int main(){  

int rows =4; 
int cols = 4; 

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

    return(0); 
} 

декларации шаблона:

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(); 



}; 
+1

Вы скопировали компиляционный код? Что вы подразумеваете под пустым? – UmNyobe

+0

Можете ли вы опубликовать свою основную функцию. –

+0

Пожалуйста, напишите * полный *, * минимальный * рабочий пример. Кодовые фрагменты не помогают. –

ответ

3

Я бы убедиться, что вы используете переменные данные и ваши переменные строк и столбцов в классе. Это далеко не самая полная версия, но она компилируется и работает нормально.

Также убедитесь, что вы используете «Т», а не «int» в своем конструкторе. См. Комментарии.

Обратите внимание на два комментария в функции печати об использовании строк и столбцов вместо жесткого кодирования значений.

#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 

Главное здесь.

#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; 
} 
+0

Спасибо, что это сработало. Итак, все, что я ошибался, было то, что данные были общедоступными, а не частными? И какой-то тип литья? –

+1

@TamaraCaligari Да, вы правы. Я забыл добавлять комментарии, где я исправил эти ошибки. Я добавлю эти изменения. Обычно я позволяю своей среде IDE создавать заглушки для моих классов. – phyatt

+0

Еще раз спасибо! :) Единственная проблема у меня теперь, когда я перегрузить функцию оператора: шаблон T & CMatrix :: оператор() (строка INT, INT Col) { возвращает данные [строки] [Col]; } Это возвращает 0.0: / –

Смежные вопросы