|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.09.2010, 09:09 | #1 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Способы создания объектов и арифметика указателей
Вот сам код:
http://paste.org.ru/?fna8v4 Проблема следующая: Я страх как не хочу видеть в коде ссылочные типы на объект и уж тем более очень не хочется видеть выражения вида (*a)[0]. Опять же не очень хочется делать некий абстрактный класс для сокрытия арифметики указателей( да и можно ли такое сделать в данном случае? ), да и не знаю как. Как можно данную проблему решить и что не так у меня в классах, может быть я где то допустил ошибку? Так же интересует чем различаются данные способы создания объектов: List* a=new List(0); List b(0); Я так понимаю первый живет ровно до тех пор пока на него ссылается хотя бы один указатель, а вот второй это просто напросто ссылка на объект? Первый не умрет если на него будет что либо ссылается, а вот второй умрет сразу после выхода из области видимости? PS: Меня так же посещала мысль сделать из этого класса функтор, это конечно решит проблему но выглядит как то уж криво слишком, с таким же успехом можно будет и обычную функцию использовать. Хочется настоящей неподдельной инкапсуляции, так что б тип данным выглядел взаправдашним
"Тяжело в учении, легко в бою" - А.В. Суворов
|
11.09.2010, 10:01 | #2 | |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
А зачем вам вообще там понадобились ссылки?
Кстати, разыменовывать ссылки вообще не надо. Код:
Разыменовывать нужно только указатели. Вообще почитайте про ссылки побольше. По поводу Код:
А насчет Цитата:
В стандартном C++ сборщика мусора нет, и вам необходимо явно удалять все динамически создаваемые объекты, иначе у вас будут утечки памяти. Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
|
11.09.2010, 10:05 | #3 |
somewhere else
Участник клуба
Регистрация: 17.07.2008
Сообщений: 1,409
|
Ссылка это первое что пришло в голову в качестве способа избавится от конструкций вида (*a)[0]. С выделением памяти понятно, спасибо, а вот как избавится от этой уродливой конструкции? (*a)[0]. Должен же быть способ?
"Тяжело в учении, легко в бою" - А.В. Суворов
|
11.09.2010, 10:11 | #4 | |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
Ivan_32
(стёрто) (тьфу, пока отвечал, вы уже пять постов написали, экие вы быстрые) Цитата:
|
|
11.09.2010, 10:23 | #5 | ||||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,065
|
Цитата:
Цитата:
Посмотрим на плюсы и минусы двусвязных списков: + Простой и относительно быстрый перебор элементов как слева-направо, так и справа-налево + Быстрая вставка элементов (в том числе и в центр списка) - Медленный доступ по индексу - Избыточность памяти (на каждый элемент лишние 2 указателя на соседние элементы) Класс List позволяет вставить элемент только в конец списка, причем делает это ужасно неоптимально и медленно (почему бы не хранить указатель на последний элемент списка рядом с ListNode *first? Получить элемент можно только по индексу, а это тоже ужасно медленно для списка. Нужно перебрать все элементы - пиши цикл for и к каждому элементу достукивайся по индексу. И для каждого элемента список будет проверяться с первого элемента. ListNode в данном виде обязан быть struct, а не class. Никакой инкапсуляции. Я легко могу получить указатель на следующий/предыдущий элемент списка и поломать весь список. Эти недостатки убираются тем, что пользователь оперируется только классом List, а ListNode в явном виде не используется. Только вот как будет в этом случае реализована нормальная вставка в центр списка, перебор всех элементов,... я не представляю. Цитата:
Первый случай с new - создание объекта в куче. Объект будет жить до тех пор, пока не вызовется delete для него. Не удалили объект, потеряли на него указатель - получили утечку памяти, т.к. объект уже никто не уничтожит. Во втором случае объект создаётся на стеке. Его удалять вручную нельзя, а память очистится автоматически, как только закончится область видимости объекта. Объект - локальная переменная функции, значит удалится при завершении работы функции. Объект - член класса, значит удалится при выполнении деструктора. Объекты, созданные на стеке, можно считать безопасными в плане утечек памяти. При создании объекта в куче, нужно следить за исключениями, не забывать их удалять,... Это всё нужно продумывать при проектировании программы, библиотеки,... Общий стиль управления памятью должен быть. Лучше всего придерживаться правила: кто создал объект, тот его и должен удалить. Так же есть так называемые "умные" указатели (auto_ptr, shared_ptr,...) именно при их использовании, объекты будут жить до тех пор, пока они кому-то нужны. Ну это одна из стратегий, а их для "умных" указателей несколько Цитата:
|
||||
11.09.2010, 16:46 | #6 | |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Цитата:
Код:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Понятия принципа создания динамических объектов | Golovastik | Общие вопросы C/C++ | 25 | 05.06.2010 21:18 |
способы ввода массива | Алексей Долгов | Помощь студентам | 0 | 24.05.2010 19:51 |
проблема создания массива объектов | Meduzza | Общие вопросы C/C++ | 3 | 28.05.2009 05:07 |
способы работы с Б.Д. | Ванька | БД в Delphi | 1 | 20.11.2007 22:12 |
способы создания баз | Ванька | БД в Delphi | 2 | 20.11.2007 12:42 |