Войти

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


mrcnn
05-07-2008, 10:05
Мне нужна матрица из векторов, например такого вида
(0,0,0) (1,1,1)
(1,1,1) (1,1,1)
Для этого нужно, чтобы я мог создавать матрицу произвольного типа : то есть, чтобы функция получила тип и динамически создала данные нужного типа

1. Как описать произвольный тип матрицы?

template <class T>
typedef T** matrx;
(Насколько правильно такое описание?)

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

template <class T>
matrx create_matrix(int sz, T)

3. matrx create_matrix(int sz, T) Как функция может определить что за параметр T ей "прислали"?
Нужно чтобы функция автоматически определила тип T и динамически создала данные нового типа matrix[k]=new T[columns];
matrx create_matrix(int rows, int columns);
matrx create_matrix(int rows, int columns)
{
matrx matrix;
matrix = new vectr[rows];
for(int k=0;k<rows;k++)
{
matrix[k]=new T[columns];
}
return (matrix);

}


Сейчас в таком виде

typedef doubl** matrx;
matrx create_matrix(int rows, int columns);
matrx create_matrix(int rows, int columns)
{
matrx matrix;
matrix = new vectr[rows];
for(int k=0;k<rows;k++)
{
matrix[k]=new doubl[columns];
}
return (matrix);

}

то есть функция создает матрицу только типа заданного как doubl
typedef int doubl;
typedef double doubl;

mrcnn
05-07-2008, 11:57
Видимо, чтобы это сделать, надо реализовывать полностью абстрактные классы и конструкторы в зависимости от типа данных.. Буду читать литературу - с наскока, не понимая до конца синтаксис классов в с++, абстрактный класс матрицы не просто реализовать..

Я хотел объединить эти две функции в одну, используя только методы структурного программирования

typedef int doubl;
typedef doubl* vectr;
typedef COLORREF* vectr_clrs;
typedef doubl** matrx;
typedef COLORREF** matrx_clrs;
matrx create_matrix(int rows, int columns)
{
matrx matrix;
matrix = new vectr[rows];
for(int k=0;k<rows;k++)
{
matrix[k]=new doubl[columns];
}
return (matrix);

}

matrx_clrs create_color_matrix(int rows, int columns)
{
matrx_clrs matrix;
matrix = new vectr_clrs[rows];
for(int k=0;k<rows;k++)
{
matrix[k]=new COLORREF[columns];
}
return (matrix);
}

mrcnn
07-07-2008, 20:27
Задан такой класс.


template <class T>
class vector
{
public:
typedef T* iterator;
vector(int sz);
~vector() { delete []v;}
iterator begin() { return v;}
iterator end() {return v+sz;}
show_sz();
int get_sz();
show_vector();
private:
T* v;
int sz;
};

Для чего мы ставим ключевое слово typedef в строке "typedef T* iterator;"? Почему нельзя написать "T* iterator;"?

pva
10-07-2008, 15:55
для работы с линейной алгеброй в с++ есть шаблоны valarray<typename T>, правда, как говорят разработчики стандарта, за него не было ответсвенного, поэтому он сделан полу-тяп-ляп. В принципе работает, нареканий не было

#include <valarray>
std::valarray<std::valarray<double> > matrix(2, std::valarray<double>(3, 0.)); //- матрица 3x2, инициализированая нулями

мтаричные операции так же можно делать через slice




© OSzone.net 2001-2012