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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите советом, массивы, указатели... 
:(
    Опции темы
BlowFish
  Дата 28.2.2003, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 29.3.2002
Где: Санкт-Петербург

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



Добрый день!
Я написал свой одномерный массив и для него определил operator[]:
Код
template<class T> class CVec{
uint N; //длина вектора
T *Data;
public:
CVec(const uint n);
CVec():N(0){};
~CVec();
T& operator[] (const uint i);
...
};
использую например так
Код
CVec<int> V(10);
...
if (V[k]>0) {/*....*/}
Все хорошо, только вот программе мне желательно пользоваться динамическим объектом (т.е. через указатель CVec<int>*). Тогда предыдущий код придется переписать:
CVec<int> *V = new CVec<int>(10);
...
if ((*V)[k]>0) {/*....*/}
Как-то неочень красиво, жаба душит... Можно ли определить оператор[] для указателя?
Что можете посоветовать?
PM MAIL   Вверх
BlowFish
Дата 1.3.2003, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 29.3.2002
Где: Санкт-Петербург

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



не хочется, чтоб тема утонула без ответа...
PM MAIL   Вверх
Fantasist
Дата 1.3.2003, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: 4
Всего: 41



Для указателя нельзя. А зачем тебе вообще динамически создавать вектор? Его специально придумывали, как статическое хранилище динамически создаваемых объектов. В этом варианте он гораздо лучше работает.
А вообще, в таких случаях можно определить оберку:

Код


template <class _Type>
class CDynVector
{
  typedef CVec<_Type> Vector;
private:
   Vector* mData;
public:
   CDynVector(): mData(0);
  ~CDynVector() {delete mData;};
   
  void NewInstance(int size) {delete mData; mData=new Vector[size];}
 
  operator Vector() {return *mData;}
}

....

{
  CDynVector<int> vec;
   
   vec.NewInstance(10);
   
   vec[10] = 5;    //тут должно сработать (vec.operator Vector())[10]=5;
}


Только зачем делать обертку над оберткой?


--------------------
Волны гасят ветер...
PM MAIL   Вверх
BlowFish
Дата 1.3.2003, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 29.3.2002
Где: Санкт-Петербург

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



У меня есть внешние вектора и матрицы (далее просто данные). Так же есть некий класс CDriver, который обрабатывает эти данные. У возник меня вопрос как это все связать. На ум пришло два решения:
1. Поместить в CDriver данные статически, т.е. сначала в конструкторе подготовить пустые вектора и матрицы нужного размера. А потом функциями-членами CDriver заполнить эти данные.
2. Поместить данные динамически (т.е. указатели). И потом также функциями-членами CDriver заполнить эти данные.

Видно, что второй способ более эффективен, т.к. не требует предварительной инициализации данных, а сразу же подразумевает копирование. Таким образом я пошел вторым способом и столкнулся с проблемой (см. первый постинг).
А вообще я хотел написать прграмму так:
сначала написать классы для работы с векторами и матрицами и обеспечить их нужными операторами, потом написать некий класс CDriver, в котором уже упор сделать на математику.
Правильно ли я рассуждаю при проектировании программы? Какие дадите советы?

PM MAIL   Вверх
Fantasist
Дата 1.3.2003, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: 4
Всего: 41



Так. Тут у тебя какая-то путаница, между данными и их хранилищем. Вектора, матрицы и т.п. - это все классы-коллекции - хранилища данных. Делать их динамическими в твоем случае совершенно не нужно и более того - не рационально. Далее данные - это как раз то, что храниться в этих коллекциях. Они-то как раз и будут создаваться динамически. Если у тебя изначально нет никаких данных - у тебя будут пустые коллекции. По мере надобности ты будешь их заполнять.
Если тебя интересует эффективность использования памяти - то класс-коллекция должна его обеспечить, а не некторые куски программы, где ты эти коллекции используешь. Так стандартным решением является выделение памяти куском (то есть сразу под некоторое количество елементов), размер которого указывает пользователь и далее, если этот кусок заполняется, выделять еще один кусок, размер которого, опять же, указывает пользователь. Для разных реализаций это можно сделать по разному, например, для простых типов, можно использовать что-нибудь типа realloc. Для классов так, конечно, не подойдет - их нужно копировать с помощью конструктора. В стандартной библиотеке C++ есть то, что тебе нужно:

std::vector - для сложных типов.
std::valarray - для простых.

Это сообщение отредактировал(а) Fantasist - 1.3.2003, 06:46


--------------------
Волны гасят ветер...
PM MAIL   Вверх
BlowFish
Дата 2.3.2003, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 29.3.2002
Где: Санкт-Петербург

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



понятно, с некоторого момента я тоже стал так думать... Я знаю, что существует стандартная библиотека, которая написана для того, чтоб её использовали. Просто мне было интересно написать самому "классы-коллекции". Узнаешь много нового, плюс это интересно
PM MAIL   Вверх
Fantasist
Дата 4.3.2003, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

Репутация: 4
Всего: 41



Цитата
Просто мне было интересно написать самому "классы-коллекции". Узнаешь много нового, плюс это интересно


Это точно, но вначале следуют разобраться с тем, что есть. Решения, найденные и отлаженные в течении нескольких лет (десятков, даже), стоят того, чтобы с ними ознакомиться. После этого гораздо больше будешь знать основы, как к этому делу вообще подходить.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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