|
|
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
при создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта. при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 11:54 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
привально. берем переменную - класс, инициализируем, она получает какой-тор адрес. И тут же удаляем (адрес был получен до входа в конструктор) Класс становится пустым, а адрес в переменной не NULL можно попоробоавть this=NULL хотя вряд ли поможет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 12:02 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Aklin this=NULL [C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 12:06 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Тут скорее можно прийти к одному из DesignPatterns. Почему бы Вам не воспользоваться синглетоном? Нечто вроде: class MyClass { static MyClass *Singleton; MyClass(); ~MyClass(); public: static MyClass * Create(); static void Destroy(); static MyClass * Instance(); }; //------------------------------- MyClass * MyClass::Singleton = 0; MyClass::MyClass() { //... } MyClass::~MyClass() { //.... } MyClass * MyClass::Instance() { ASSERT(Singleton); return Singleton; } MyClass * MyClass::Create() { if(!Singleton) { Singleton = new MyClass(); return Singleton; } else return 0; } void MyClass::Destroy() { if(Singleton) delete Singleton; } Только с assertom поправьте меня, как верно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 12:09 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Edward Mingaziev Aklin this=NULL [C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead Если есть оператор new так есть и опреатор delete. попробуй их использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 12:52 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта. при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе? Аааааааа эксцепшен генери, чудо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 13:06 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Edward Mingaziev Aklin this=NULL [C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead Присвоение this-у запрещено стандартом в незапамятные времена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 13:10 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
ИМХО оператор new - это вызов alloc() и далее работа с полученным куском памяти (по типу setmem). Естественно, т.к. внутрь setmem передается указатель на созданный объект, у тебя нет возможности изменить указатель, хоть на уши встань. Т.о., реально только сгенерировать exeption в конструкторе и перехватив его снаружи вызвать free (деструктор). Либо в конструкторе вызвать деструктор, сгенерить исключение, а при перехвате занулить указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 13:16 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, придется генерировать exception и заключать каждый new в try, хотель бы конечно сделать попроще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 13:23 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Просто подумай, что будет если кто-то создаст твой хитрый объект не в хипе, а на стеке. И все станет ясно P.S. A new это не токма malloc, но еще и вызов конструктора (то-же касается и деструкторов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 13:26 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Ну вот не успел маленького потоптать! Но зайдем с другой стороны, аот в старые добрые времена, когда exception были реализованы мало у кого. Люди заводили понятие состояния объекта (iostream), взводили errno, заводили функцию игнициализации или делали ее отложенной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2006, 20:01 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
По-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться... Все требования, предъявляемые к поведению класса, отражаются на СТРУКТУРЕ класса, что и есть паттерны ООП. Можно ли создать еще один объект - за этим должен следить не конструктор, а статическая функция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 10:03 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceПо-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться... Все требования, предъявляемые к поведению класса, отражаются на СТРУКТУРЕ класса, что и есть паттерны ООП. Можно ли создать еще один объект - за этим должен следить не конструктор, а статическая функция Таким образом, вся Жаба является не правельной и не отражает стуктуру ООП. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 10:35 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceнеправильно выбрасывать исключения в конструкторе. Читай классиков. Саттер и Майерс тебе помогут. К сожалению, альтернативы еще неправильнее (как в случае Subj) или неудобнее (заведение флажков состояния инициализации объекта). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 12:15 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Ну не сомненно delete из конструктора вызывать нельзя. хотя бы потому что это не логично, объект до конца не построен а вызывается деструктор. Но и выбрасывание исключения не всегда удобно. Уж больно аккуратнным надо быть чтобы ресурсы не потекли. а конструкция типа MyClass::MyClass(...) : try { x() } catch() { ... } { .. } производит на меня неизгладимое впечатление. Кстати про нелюбовь к std::auto_ptr. очень помогает избежать утечек ресурсов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 12:54 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
auto_ptr не надо любить, им надо пользоваться ПО НАЗНАЧЕНИЮ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 13:37 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Объект нельзя удалять в конструкторе. Нужно использовать либо исключение, либо признак. Признак безопаснее, при исключении класс может быть недоконструирован. class MyClass{ bool bValid; MyClass(); ~MyClass(); bool IsValid(){return bValid;} ... }; ... MyClass *ptr = new MyClass(); if ( !ptr->IsValid() ) { delete ptr; ptr = NULL; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2006, 16:32 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта. при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе? Так делать сугубо противопоказано. Конструктор не создает объект, не выделяет под него память и не знает, в какой памяти находится объект. Поэтому правильно удалить объект в конструкторе невозможно. Если вам нужно просигнализировать о неправильности объекта, вам нужно выкидывать исключение (выкидывание исключения из конструктора -- тема отдельная, веселая) и потом его ловить где- то и что- то делать. При этом если у вас переменная объекта автоматическая, все удалиться само, если динамическая - тоже. Это самый удобный и правильный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 05:47 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceТут скорее можно прийти к одному из DesignPatterns. Почему бы Вам не воспользоваться синглетоном? При чем здесь синглтон ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 05:49 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceПо-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться... Исключение всегда может не отлавливаться. Чем здесть конструкторы уникальны, не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 05:52 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Синглетон как возможный вариант. Там можно создавать лишь один объект класса, если нужно немного другое условие, то модифицируется функция Create (ну назовем это MultiSingleton:). Классика в чем-то уже устарела, и я все-же думаю, что в конструкторе исключения выбрасывать нельзя. Не совсем нельзя, конечно. Если при конструировании возможны ошибки, то тогда ладно. Но если вы хотите регламентировать количество создаваемых объектов, то либо static-функция конструирования, либо флаг и функция проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 06:45 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым). Не вижу, чем помог бы здесь delete this в конструкторе (если бы это можно было делать), поскольку в момент его вызова объект был-бы точно также НЕДОКОНСТРУИРОВАН как и при бросании исключения (неговоря о том, что на момент выхода из конструктора его статус вообще мне лично был-бы непонятен, а применение этой замечательной технологии к автоматически созданному (или о ужас созданному в другом объекте) объекту привело бы к тому, что отладчик стал бы вашим любимым инструментом, а работа домом). Лично я в таких случаях применяю флажки (и меня за это бьют). Вопрос личных предпочтений. Исключений, как и любых предоставляемых средств не надо БОЯТСЯ, надо просто ОТЧЕТЛИВО понимать, что и как происходит в вашей программе (если уж вам сподобилось писать на C++). Если для вас это слишком сложно, есть Васик и Шрап. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 08:30 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 09:23 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceСинглетон как возможный вариант. Там можно создавать лишь один объект класса, если нужно немного другое условие, то модифицируется функция Create (ну назовем это MultiSingleton:). Классика в чем-то уже устарела, и я все-же думаю, что в конструкторе исключения выбрасывать нельзя. Не совсем нельзя, конечно. Если при конструировании возможны ошибки, то тогда ладно. Но если вы хотите регламентировать количество создаваемых объектов, то либо static-функция конструирования, либо флаг и функция проверки. Я так понимаю, вы предлогаете использовать не сенглетон, а некий враппер на класс, который будет отвечать за целостность объекта. Не кажется ли вам, что объект должен сам отвечать за свою целостность и кто будет отвечать за целостность враппера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 09:55 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpace2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем.. Вас никто не обязывает использовать исключения. Используйте флаги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 09:56 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33949087&tid=2028312]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
225ms |
get topic data: |
10ms |
get forum data: |
4ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 566ms |

| 0 / 0 |
