Шаблон матрицы C ++ с использованием указателей - PullRequest
0 голосов
/ 05 сентября 2011

Вот шаблон матрицы, который я недавно начал реализовывать. У него не так много функций, так как, как я уже сказал, я только начал

Заголовочный файл:

#ifndef MATRIXX_H
#define MATRIXX_H

#include <iostream>
using namespace std;

template <typename theType> class Matrix
{
public:
Matrix()
{
    rows = columns = 0;
    matrixRoot = new theType *[rows];
    for(int i = 0; i < rows; i++)
    {
        matrixRoot[i] = new theType[columns];
    }

}

Matrix(int rows, int columns) 
{
    matrixRoot = new theType *[rows];
    for(int i = 0; i < rows; i++)
    {
        matrixRoot[i] = new theType[columns];
    }
}

~Matrix()
{
    delete [] *matrixRoot;
    delete [] matrixRoot;
}

int numrows() const
{
    return rows;
}

int numcols() const
{
    return columns;
}

private:
int rows;   
int columns;    
theType **matrixRoot;

};

#endif

Проблема возникает, когда я пытаюсь запустить эту программу тестирования:

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

void TestingMatrix()
{
int r = 5;
int c = 4; 
Matrix<int> a(r, c);

cout << "Number of rows: " << a.numrows() << " Number of columns: " << a.numcols() << endl;
}

int main()
{
TestingMatrix();
}

Если это будет правильно, я ожидаю, что результат выдаст что-то вроде:

Количество строк: 5 Количество столбцов: 4

Вместо этого я получаю что-то way off:

Количество строк: 134515193 Количество столбцов: 2515748

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

Очевидно, что я никуда не смогу добраться, если не смогу даже правильно инициализировать экземпляр матрицы, поэтому я хотел бы знать, что я делаю неправильно, что дает мне такие ошибочные результаты. Кстати, я знаю, что мой деструктор также испортился, так как это вызывает ошибку программы (смеется), но это проблема, которую я планирую решить самостоятельно в будущем. Я был бы очень признателен, если бы кто-то мог объяснить, почему я получил эти числа для строк и столбцов и как я могу получить их, чтобы они возвращали правильные значения.

Спасибо. (

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011
Matrix<int> a(r, c);  // Invokes constructor with arguments.

Вы не инициализируете переменные-члены rows и columns, присутствующие в конструкторе с двумя аргументами.И поэтому получаю некоторые значения мусора от их получателей.

Matrix(int rows, int columns) : rows(rows), columns(columns)
                               // ^^^^^^^^^^^^^^^^^^^^^^^^^ Add this
{
       // ....
}
1 голос
/ 05 сентября 2011

Вы забыли установить переменные-члены rows и columns в одном из ваших конструкторов. Одним из способов является использование присваивания, но предпочтительным и лучшим способом инициализации переменных-членов является использование ctor-initializer s следующим образом:

Matrix(int rows, int columns) : rows(rows), columns(columns)  
{ 
    matrixRoot = new theType *[rows]; 
    for(int i = 0; i < rows; i++) 
    { 
        matrixRoot[i] = new theType[columns]; 
    } 
} 

Объявление Matrix<int> a(r, c); вызывает двухпараметрическую версию конструктора Matrix. Эта конкретная версия не инициализировала переменные rows и columns.

Хорошее практическое правило заключается в том, что если вы получаете полностью мусорные значения, вы забыли инициализировать их где-то разумным значением.


При этом я рекомендую вам взять хорошую вводную книгу по C ++ и прочитать ее. Ошибки, которые вы получаете, связаны с инициализацией переменных, и это очень фундаментальный аспект языка.

0 голосов
/ 05 сентября 2011

Поскольку вы не инициализируете члены rows и columns вашего класса в конструкторе, где вы передаете строки и столбцы.Для этого они содержат мусор из памяти.

Matrix(int rows, int columns) 
{
    this->rows = rows;
    this->columns = columns;
    matrixRoot = new theType *[rows];
    for(int i = 0; i < rows; i++)
    {
        matrixRoot[i] = new theType[columns];
    }
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...