| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Помогите советом |
| Автор: BlowFish 28.2.2003, 06:58 | ||||
| Добрый день! Я написал свой одномерный массив и для него определил operator[]:
CVec<int> *V = new CVec<int>(10); ... if ((*V)[k]>0) {/*....*/} Как-то неочень красиво, жаба душит... Можно ли определить оператор[] для указателя? Что можете посоветовать? |
| Автор: BlowFish 1.3.2003, 02:19 |
| не хочется, чтоб тема утонула без ответа... |
| Автор: Fantasist 1.3.2003, 03:10 | ||
| Для указателя нельзя. А зачем тебе вообще динамически создавать вектор? Его специально придумывали, как статическое хранилище динамически создаваемых объектов. В этом варианте он гораздо лучше работает. А вообще, в таких случаях можно определить оберку:
Только зачем делать обертку над оберткой? |
| Автор: 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 | ||
Это точно, но вначале следуют разобраться с тем, что есть. Решения, найденные и отлаженные в течении нескольких лет (десятков, даже), стоят того, чтобы с ними ознакомиться. После этого гораздо больше будешь знать основы, как к этому делу вообще подходить. |