|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.02.2013, 14:32 | #1 |
Регистрация: 20.02.2013
Сообщений: 6
|
Выделение и освобождение памяти в конструкторе и деструкторе
Помогите задать конструктор выделяющий память для переменных x1,y1,z1,x2,y2,z2 и деструктор ее освобождающий.
Код:
|
20.02.2013, 15:07 | #2 |
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
1) Память для членов примитивных типов (float относится к таковым) выделяется как часть памяти, выделяемой под объект (т.е. переменная v1 имеет размер не менее 16*sizeof(float)). Соответственно, код для выделения/освобождения этой памяти в приведённом примере генерируется компилятором автоматически.
2) Код кошмарен. Переменные-члены не должны иметь уровень доступа public, если только для этого нет очень веских оснований. Методы sum и raz вводят в заблуждение, возвращая значения, не имеющие ничего общего с "суммой" или "разностью". Также они меняют состояние объекта в высшей степени неочевидным образом. Основная программа запутывает ещё больше: класс vectors, по всей видимости, описывает пару векторов, в программе объявляются две пары, но каждая из них остаётся в не полностью инициализированном состоянии. Отдельно путаницы добавляют разночтения в индексах членов (x1, x2, x3 нет, но есть z2) и аксессоров (u1, u2, u3). |
20.02.2013, 16:21 | #3 | |
Регистрация: 20.02.2013
Сообщений: 6
|
Цитата:
По поводу кошмарности кода. Это моя первая программа с использованием классов так что как сделать по-другому я просто не знаю. Последний раз редактировалось abc7; 20.02.2013 в 16:40. |
|
20.02.2013, 16:21 | #4 | ||
Играюсь с Python
Форумчанин
Регистрация: 12.12.2012
Сообщений: 340
|
Цитата:
Цитата:
|
||
20.02.2013, 16:58 | #5 | ||
Старожил
Регистрация: 25.10.2011
Сообщений: 3,178
|
Цитата:
1) Уничтожена возможность переименовать или убрать переменную, модифицируя только код класса. К примеру, класс хранит длины сторон прямоугольника и его площадь - если мы сделали площадь переменной, а потом решили, что выгоднее её только вычислять при обращениях, геттер позволит провести такое изменение, а прямой доступ нет (потому что перестанет работать код, обращавшийся к этой переменной). 2) Уничтожена возможность гарантировать инварианты класса. Опять же, если у нас есть класс прямоугольника и три переменных - длина, ширина, площадь, - мы можем гарантировать в коде класса, что всегда площадь==длина*ширина. А если переменные может поменять любой хрен с горы, такой гарантии дать уже нельзя. 3) В случае управляемых ресурсов повышается опасность того, что ссылка на ресурс переживёт управляющий объект. Если наш объект получил файловый дескриптор и не дал возможности его "утащить" - с уничтожением объекта возможность доступа к данному дескриптору гарантированно утеряна, поэтому его можно освободить. А если это открытый член, то какой-нибудь дятел скопирует себе дескриптор, попытается использовать его после уничтожения объекта... и будет упс. 4) Нарушается инкапсуляция, сокрытие информации. Данные-члены обычно содержат информацию о том, как именно реализован объект. Если они закрыты, эту информацию следует держать в голове только во время работы над кодом класса. Если они открыты, эта информация актуальна в любой точке, где используется класс. Чем больше факторов надо удерживать в голове при написании кода, тем тяжелее его писать, легче совершить ошибку и тяжелее понять получившийся код впоследствии. Цитата:
|
||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
выделение памяти и ее освобождение | Артэс | Общие вопросы C/C++ | 15 | 03.11.2012 14:22 |
Динамическое Выделение Памяти В Конструкторе Класса | D-Vampire | Общие вопросы C/C++ | 5 | 20.12.2011 00:34 |
Расхождение адресов в конструкторе и деструкторе | _-Re@l-_ | Общие вопросы C/C++ | 13 | 13.08.2011 20:31 |
Полиморфизм и выделение (освобождение) памяти | Scogan | Общие вопросы C/C++ | 9 | 13.04.2009 07:57 |
Освобождение памяти | AlexandrSid | Общие вопросы Delphi | 3 | 02.02.2009 13:45 |