Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 78
от 02.04.2005, 18:20

Администратор:Калашников О.А.
В номере:Вопросов: 2, Ответов: 12


Вопрос № 18856: Здравствуйте! Мне нужно удалить обьект класса! Удаляя с помощью пустого деструктора, то данные полей сохраняются! Это так должно быть?...
Вопрос № 18879: Здравствуйте эскперты Может кто подскажет решение проблемы. Создаю класс. В нем хочу определить константы, которые потом будут использоваться и внутри класса и извне. Встал вопрос, как определить константы внутри тела класса. Оши...

Вопрос № 18856
Здравствуйте! Мне нужно удалить обьект класса! Удаляя с помощью пустого деструктора, то данные полей сохраняются! Это так должно быть?
Отправлен: 27.03.2005, 19:41
Вопрос задал: Сергей Николаевич (статус: 1-ый класс)
Всего ответов отправлено: 6

Отвечает: KHeLeKRoN
Здравствуйте, Сергей Николаевич!
"Содержимое" деструктора, по сути, это то, что вызывается при уничтожении объекта класса (ручном, автоматическом - не важно). Если деструктор пустой, то ничего не удаляется! И вообще ничего не делается! Но даже если ты пропишешь в деструкторе что-нибудь, то не весь класс удалится.
Поэтому, когда ты создаешь класс, то ты сделай указатель на класс, а потом при помощи new или malloc () (кому как больше нравится) выдели память. Когда тебе понадобится удалить объект, то вызываешь delete или free (), которые полностью освобождают память, занимавшуюся объектом:
CYourClass* objectPointer = new CYourClass;
... // поработали с объектом, пора удалить
objectPointer -> ~objectPointer (); // Я не помню, вызывает ли delete деструктор или нет, по-моему нет... Поэтому пишем это...
delete objectPointer;
Ответ отправил: KHeLeKRoN (статус: 1-ый класс)
Отправлен: 27.03.2005, 20:12

Отвечает: dentist
Здравствуйте, Сергей Николаевич!
а сам деструктор описать не пробовал? :)
типа:
MyClass::~MyClass()
{
memset(this, 0, sizeof(*this));
}
Ответ отправил: dentist (статус: 1-ый класс)
Отправлен: 27.03.2005, 20:31

Отвечает: Malish
Здравствуйте, Сергей Николаевич!
Лучше при таком вопросе указывать какие переменные были в этом классе. Если там использовалось динамическое выделение класса, а в основном так оно и есть, то пустой деструктор не подходит - это ошибка. А если не выделялась то все нормально. Можешь проверить : запусти прогу и посмотри сколько оперативы выжирает, а когда срабатывает деструктор - посмотри еще раз и просто сравни показания.
Ответ отправил: Malish (статус: 5-ый класс)
Отправлен: 27.03.2005, 23:30

Отвечает: Bob Johnson
Здравствуйте, Сергей Николаевич!
хм... ну лучше сказать "экземпляр класса"... А как ты его удаляешь? вызываешь деструктор сам? так не делают... деструктор вызывается автоматически при окончании жизни объекта или когда ты выполняешь delete. в общем, если у тебя экземпляр создается динамически с пом. new, то удалять его надо самому с пом. delete, например:
CMyFckClass *f = new CMyFckClass (...);
...
delete f;

И еще деталь - удалять надо именно тип указателя на класс (т.е. class *), а не void *, например. Т.е. вот так делать нельзя:
void *p = f;
delete p;
В этой ситуации компилятор не сможет правильно удалить экземпляр, потому что он не имеет представления о том, что его попросили удалить.

* EMan2.0: ---===*** Debug mode ***===---

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 27.03.2005, 23:58

Отвечает: vitya
Здравствуйте, Сергей Николаевич!
Делается просто. Удаляйте так же поля.
Ответ отправил: vitya (статус: Профессор)
Отправлен: 28.03.2005, 09:50

Отвечает: Voituk Alexander
Здравствуйте, Сергей Николаевич!
Интересно как можно удалить объект с помощью деструктора.
Удалить объект можно с помощью команды delete. При этом вызывается деструктор класса. Если это класс - наследник TObject, то у него уже есть свой деструктор - виртуальный и можно свой не объявлять. Но если ты в своем классе выделяешь память под какие-либо объекты, то нужно обязательно писать свой деструктор и там эту память освобождать. Иначе если ты в своей проге часто создаешь и удаляешь этот объект, то будет серьезная утечка памяти.
Ответ отправил: Voituk Alexander (статус: 6-ой класс)
Отправлен: 28.03.2005, 12:17


Вопрос № 18879
Здравствуйте эскперты
Может кто подскажет решение проблемы.
Создаю класс. В нем хочу определить константы, которые потом
будут использоваться и внутри класса и извне. Встал вопрос, как определить
константы внутри тела класса.
Ошибки компилятора приводить не буду, т.к. они достаточно длинные.
Объявляешь в определении класса const int nData=1 дает ошибку "нельзя определять". Инициализируешь в конструкторе - пишет, что требуется static. Добавляешь в определении static - указывает на попытку изменить const объект.
с уважением Юнусов Ильдар
ildar_trvl@rambler.ru
Отправлен: 28.03.2005, 12:19
Вопрос задал: ildar (статус: Посетитель)
Всего ответов отправлено: 6

Отвечает: DSota
Здравствуйте, ildar!
Можно определить (рекомендуют):
int nData(){return 1;};
Ответ отправил: DSota (статус: Студент)
Отправлен: 28.03.2005, 12:24

Отвечает: vitya
Здравствуйте, ildar!
A какой у вас компилятор? в 6-ом VC++ это например просто невозможно.
Ответ отправил: vitya (статус: Профессор)
Отправлен: 28.03.2005, 13:25

Отвечает: DiGiT
Здравствуйте, ildar!
А в чем проблема то ? пишешь статический член. А значение ему присваиваешь в каком нить модуле. Но не в конструкторе и типа такого CMYClass::m_myconst= 1;
И к тому же как ты собрался значение типа const изменять ??
Ответ отправил: DiGiT (статус: 6-ой класс)
Отправлен: 28.03.2005, 14:41

Отвечает: Voituk Alexander
Здравствуйте, ildar!
Это вряд ли. Дело в том, что создавая объект класса - выделяется память под переменные. А под константы нет. Я не пойму в чем проблема. Создай их вне класса и пользуйся себе везде.
Ответ отправил: Voituk Alexander (статус: 6-ой класс)
Отправлен: 28.03.2005, 16:25

Отвечает: Bob Johnson
Здравствуйте, ildar!
определяются в такой ситуации они так:
class my
{
static int nData;
...
} - это в .h файле.
а присваивается значение - так:
my::nData = 1; - это в .cpp файле, где у тебя реализованы остальные методы этого класса.
Ты не можешь присвоить значение потому, что класс - это тип (а не физический объект или экземпляр), тип не может содержать физических переменных, т.к. им нужна память, а тип сам по себе никакой памяти не занимает. Поэтому такую переменную надо отдельно описать и здесь же присвоить ей значение. Делать это следует только в одном месте.
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 29.03.2005, 13:56

Отвечает: Gregory
Здравствуйте, ildar!
Константы, созданные внутри класса необходимо определить до тела конструктора (см. пример)

Приложение:

Ответ отправил: Gregory (статус: 1-ый класс)
Отправлен: 30.03.2005, 01:50


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное