Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обучаемся проектированию двухмерных и трехмерных движков: шаблоны, матрицы и векторы (http://forum.oszone.net/showthread.php?t=110757)

mrcnn 05-07-2008 10:05 842817

Обучаемся проектированию двухмерных и трехмерных движков: шаблоны, матрицы и векторы
 
Мне нужна матрица из векторов, например такого вида
(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 842861

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

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

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 845114

Задан такой класс.

Код:

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 847831

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

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

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


Время: 14:19.

Время: 14:19.
© OSzone.net 2001-