Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Методы init() и dispose() - теория - C++

11.07.2013, 17:16. Просмотров 1946. Ответов 44
Метки нет (Все метки)

Всегда интересовало, зачем существуют эти методы? Допустим, есть некоторый объект класса и в коде видим:
C++
1
2
3
4
5
x = new myClass();
x.init();
...
x.dispose();
delete x;
Одно дело, если бы в эти методы передавались параметры, а другое дело это. Разве не проще было бы весь код init поместить в конструктор, а dispose, соответственно, в деструктор?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2013, 17:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Методы init() и dispose() - теория (C++):

Виртуальные методы(теория) - C++
Здравствуйте уважаемые форумчане! В ходе обучения языку с++ возник вопрос непонимания назначения виртуальных методов. Попытался...

No init for const! - C++
Доброе утро, котаны!:) Вопрос - в джаве есть возможность сделать такую штуку final boolean someBool; someBool = true; То есть...

Lambda init capture by const reference - C++
Всем привет. Почему не получается добиться следующего поведения: auto main() -> int { int ival = 0; () { // Need...

функция вида init( struct ****) - segmentation fault - C++
Прошу помочь, уже всю голову сломал. Дан следующий код struct square { bool is_rect; int is_side; struct square...

Что делает оператор init в данной ситуации (работа с двумерными массивами) - C++
Есть фрагмент кода C++. const int ROWS = 10, COLUMNS = 10; int matrix; init(&matrix); int temp, sum = 0;

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы - C++
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы Abiturient:...

44
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
11.07.2013, 17:23 #2
О-хо-хо.... Чувствую, что код древний, как окаменевшие экскременты мамонта. Дай угадаю: Turbo Vision для C++? Так этот TV и был переводом с паскалевского TV - в котором как раз и были методы Init (конструктор) и Dispose (деструктор).
Короче, забудь. С тех пор прошло уж 20 лет. Мир изменился.
1
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,994
Записей в блоге: 17
11.07.2013, 17:25 #3
Да это вы у разработчиков либы спрашивайте.

Я лишь могу предположить что init() и dispose() возвращают коды ошибки если такая возникла при их выполнении.
1
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 17:29  [ТС] #4
CheshireCat, да нет, по прежнему вижу подобное периодически. В последний раз замечал в каком-то там классе при программировании на android. Да и в directX вроде было нечто подобное, а там явно не дураки сидят. Наверное всё так, как сказала avazart.
0
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
11.07.2013, 17:39 #5
Согласен, ннооо.... тогда вот контрольный вопрос (в голову :-) ):
- что будет, если разработчик случайно (ну, где-нибудь глубоко во вложенном if()) забудет вызвать dispose() ? Останутся какие-то неосвобожденные ресурсы или что-то подобное? А если dispose() не будет вызван в результате раскрутки стека при выбросе исключения? Ась?
- что будет, если разработчик случайно же забудет вызвать init() ? Появится недоделанный объект? И как он будет существовать дальше? А что произойдет, если init() не был вызван, а к объекту применяется dispose() ?
1
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
11.07.2013, 17:49 #6
Цитата Сообщение от nexen Посмотреть сообщение
в каком-то там классе при программировании на android.
Ознакомьтесь http://en.wikipedia.org/wiki/Dispose_pattern
2
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
11.07.2013, 17:50 #7
Да, насчет "кодов ошибок":
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:03  [ТС] #8
Tulosba, а разве x = null не вызывает практически сразу сборку мусора? Ведь, фактически, dispose()-метод заставляет языки с GC следить за памятью так же, как программистам С++: им dispose(), нам delete.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,994
Записей в блоге: 17
11.07.2013, 18:07 #9
Цитата Сообщение от CheshireCat Посмотреть сообщение
C++ позволяет проигнорировать коды ошибок. В приведенном коде - никакого анализа и обработки кодов ошибок и нет.
В приведенном нет, а вообще может быть.
Иначе как по другому организовать обработку ошибок ? Кидать исключения в конструкторе и деструкторе ?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.07.2013, 18:20 #10
Avazart, В конструкторе - да. В деструкторе - нет.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
11.07.2013, 18:22  [ТС] #11
ForEveR, эм, разве в конструкторе можно кидать исключения? Имею ввиду, разве это безопасно? :0 Просто я уже как-то об этом спрашивал, меня тапками закидали
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.07.2013, 18:24 #12
nexen, В конструторе да. В деструкторе нет. Хотя, все зависит от того, что подразумевается под словом "безопасность".
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,994
Записей в блоге: 17
11.07.2013, 18:25 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, В конструкторе - да. В деструкторе - нет.
Что делать с ошибкой при уничтожении ?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.07.2013, 18:26 #14
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,994
Записей в блоге: 17
11.07.2013, 18:30 #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Всмысле? Попробуйте-ка создать std::string от nullptr.
https://ideone.com/47T8J4
Имею ввиду смысл кода который занимает ресурсы в конструкторе, а освобождать его приходится методом, а не деструктором
(что бы отловить ошибку при освобождении).
0
11.07.2013, 18:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2013, 18:30
Привет! Вот еще темы с ответами:

Создать класс Triad (тройка чисел) - определить методы; определить производный класс Date - переопределить методы - C++
Создать класс Triad (тройка чисел); определить методы увеличения полей на 1. Определить производный класс Date с полями: год, месяц и день....

Методы у JInternalFrame: setClosed(true); dispose(); - Java
Проблема следующая: по нажатию на кнопку создается окно JInternalFrame win = new JInternalFrame('New',true,true,true,true);потом в это...

Это правда, что Close() и Clear() методы в .NET классах вызывают Dispose()? - .NET
Всем привет. Подскажите, пожалуйста: 1) Это правда, что Close() и Clear() методы в .NET классах вызывают Dispose()? 2) Блок using()...

Ошибка при загрузке Ubuntu 14.04 LTS: run-init: /sbin/init: Permission denied - Ubuntu Linux
Здравствуйте! На компьютере установлена Uuntu 14.04 LTS (64 bit). После установки cups (для соединения с принтером) система перестала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru