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


Автор: BlowFish 28.2.2003, 06:58
Добрый день!
Я написал свой одномерный массив и для него определил 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) {/*....*/}
Как-то неочень красиво, жаба душит... Можно ли определить оператор[] для указателя?
Что можете посоветовать?

Автор: BlowFish 1.3.2003, 02:19
не хочется, чтоб тема утонула без ответа...

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

Код


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;
}


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

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

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

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

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

Автор: BlowFish 2.3.2003, 18:43
понятно, с некоторого момента я тоже стал так думать... Я знаю, что существует стандартная библиотека, которая написана для того, чтоб её использовали. Просто мне было интересно написать самому "классы-коллекции". Узнаешь много нового, плюс это интересно

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


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

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