Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Динамический массив объектов класса


Автор: PoloS 6.3.2010, 20:51
Всем добрый вечер!
Одно время увлекался программированием на С++. Сейчас по учебе нужно написать программу, пришлось доставать пыльные книжки с верхних полок. Но один вопрос не решился даже с книжками! Прошу вашей помощи.

Идея такая: нужно реализовать класс матрицы элементов double произвольной размерности n x m. снабдить этот класс признаками встроенных типов (операторы + - * /,  доступ к элементам name[i][j]).

Решил сделать так: класс вектора, по сути обертка над динамическим массивом из double элементов.
Код

class Vec
{
public:
    Vec(unsigned int _n) {
        if (!_n) error("Vec::Vec: n is 0");
        n=_n;
        p = new double[n];
        if (!p) error("Vec:Vec: can't allocate memory");
        memset(p,0,sizeof(double)*n);
    }
    ~Vec(void) {
        if (p) delete[] p, p = NULL;
    }
    double& operator[] (unsigned int _n) {
        if (_n >= n) error("Vec::[]: _n > n");
        return p[_n];
    }
private:
    unsigned int n;
    double *p;
};

Обратите внимание, что дефолтного конструктора у класса Vec нет, т.к. обязательный параметр - размер вектора.
А класс матрицы хочу сделать как динамический массив обьектов класса Vec. Преследуется цель, что бы можно было использовать семантику mat[i][j] для доступа к элементу матрицы.
Код

class Mat
{
public:
    Mat(unsigned int _n, unsigned int _m) {
        if (!_n || !_m) error("Mat::Mat: n or m is 0");
        n=_n;
        m=_m;
        p = new Vec(n)[m];
        if (!p) error("Mat:Mat: can't allocate memory");
    }

    ~Mat() {
        if (p) delete[] p, p = NULL;
    }

    Vec& operator[] (unsigned int _n) {
        if (_n >= n) error("Mat::[]: _n > n");
        return p[_n];
    }
private:
    Vec *p;
    unsigned int n,m;
};
 

Проблема в том, что строчка p = new Vec(n)[m];. Так как правильно создавать динамический массив из объектов класса? Просьба, использование контейнеров STL не предлагать. Этот код будет использоваться в программе метода конечных элементов, где нужна высока производительность. Спасибо!

Автор: bsa 7.3.2010, 01:06
Цитата(PoloS @  6.3.2010,  20:51 Найти цитируемый пост)
Просьба, использование контейнеров STL не предлагать. Этот код будет использоваться в программе метода конечных элементов, где нужна высока производительность.
связи нет. Например std::vector работает не медленней, чем обычный динамический массив.

На сколько я помню линейную алгебру, там размер вектора не меняется. Поэтому есть смысл отказаться от параметризированного конструктора в пользу шаблона:
Код
template<size_t dim>
class Vector
{
//...
private:
   double data_[dim];
};

template<size_t dimX, size_t dimY>
class Matrix
{
//...
private:
   Vector<dimX> data_[dimY];
};
Более того, это позволит отлавливать ошибки еще на этапе компиляции.

Автор: mes 7.3.2010, 01:18
Цитата(bsa @  7.3.2010,  00:06 Найти цитируемый пост)
Поэтому есть смысл отказаться от параметризированного конструктора в пользу шаблона:

а еще вместо изобретения велосипеда (имхо, учитывая высказывания могу предположить что на нем далеко не уедите),  лучше посмотреть в сторону boost.
smile

Автор: PoloS 7.3.2010, 11:05
действительно, т.к. размер матриц и векторов известен на момент компиляции, то остановился на классах шаблонах. bsa, Спасибо за совет!

З.Ы. Программа учебная, не хочу прикручивать boost.

Автор: bsa 8.3.2010, 17:39

M
bsa
PoloS, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)