Мне необходимо реализовать класс матриц в таком виде:
template<typename>
class TMatrix
{
private:
T** mas;
public:
TMatrix()
{
int i,j;
T** mas = new T*[ROWS];
for (i = 0; i < ROWS; ++i)
mas = new T[COLUMNS];
for (i = 0; i < ROWS; ++i)
for (j = 0; j < COLUMNS; ++j)
mas[j] = 0;
}
суть вопроса: когда мы хотим создать в main обьект этого класса, то пишим(как я думаю)
int x = 2, y = 2;
TMatrix<int,> matr; //к примеру
выдаются ошибки:
это я неправильно конструктор написал, или неправильно обьявляю обьект этого класса? В чём ошибка?
Размеры матрицы не нужно запихивать в параметры шаблона. Хотя можно, но при создании объекта придется пользоваться константами, а не переменными. Т. е. для каждого значения константы будет свой класс из шаблона.
Проще размеры использовать как переменные класса.
template<class T>
class CMatrix
{
private:
int m_Rows;
int m_Columns;
T** m_Array;
public:
CMatrix() : m_Rows(0), m_Columns(0), m_Array(0)
{
}
~CMatrix()
{
Destroy();
}
void Destroy()
{
if ( m_Array )
{
for (int r = 0; r < m_Rows; ++r)
{
delete [] m_Array[r];
}
delete [] m_Array;
}
m_Rows = 0;
m_Columns = 0;
m_Array = 0;
}
void Create(int Rows, int Columns)
{
Destroy();
m_Rows = Rows;
m_Columns = Columns;
m_Array = new T*[m_Rows];
for (int r = 0; r < m_Rows; ++r)
{
m_Array[r] = new T[m_Columns];
}
}
int Rows() const
{
return m_Rows;
}
int Columns() const
{
return m_Columns;
}
T* operator [](int Row)
{
// TODO: проверка границ массива
return m_Array[Row];
}
};
int main()
{
CMatrix<double> m;
m.Create(2, 5);
m[1][1] = 3.1416;
}
1. Неверная запись:
T** mas;
И, соответсвенно:
T** mas = new T*[ROWS];
mas = new T[COLUMNS];
2. Неверно построен цикл, нужен постинкремент, а не преинкремент.
for (i = 0; i < ROWS; ++i)
for (i = 0; i < ROWS; ++i)
3. Неверная строка вообще:
mas[j] = 0;
Ошибка написана в сообщении об ошибке. Нельзя использовать локальные переменные так как это делаешь ты. Попробуй например передавать количество строк и столбцов через конструктор, глобальные переменные - это дурной тон.