Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив объектов класса, не получается рализовать 
V
    Опции темы
PoloS
Дата 6.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 29.12.2006
Где: МО, г. Одинцово

Репутация: нет
Всего: 5



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

Идея такая: нужно реализовать класс матрицы элементов 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 не предлагать. Этот код будет использоваться в программе метода конечных элементов, где нужна высока производительность. Спасибо!
PM MAIL ICQ   Вверх
bsa
Дата 7.3.2010, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(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];
};
Более того, это позволит отлавливать ошибки еще на этапе компиляции.
PM   Вверх
mes
Дата 7.3.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



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

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


--------------------
PM MAIL WWW   Вверх
PoloS
Дата 7.3.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 29.12.2006
Где: МО, г. Одинцово

Репутация: нет
Всего: 5



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

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

PM MAIL ICQ   Вверх
bsa
Дата 8.3.2010, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.