|
|
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
AkhВас никто не обязывает использовать исключения. Используйте флаги. Я и использую ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 10:08 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpace2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем.. Трук, исключения это не толька try catch :) Ничего не имею против фабрики классов (пусть даже и статической) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 10:09 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) AkhВас никто не обязывает использовать исключения. Используйте флаги. Я и использую ;) Я тоже. Бекоз очень часто объекты имет свойство, готовы они для продолжения работы или временно развалились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 10:14 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) TopSpace2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем.. Трук, исключения это не толька try catch :) Ничего не имею против фабрики классов (пусть даже и статической) В данном случае против. Ибо нехрен огород городить на пустом месте. Сущности должны быть обоснованы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 10:15 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Ну не совсем враппер, я привел сверху пример. Класс сам управляет созданием своих объектов(это не ClassFactory), но делается это не ч/з конструктор, а другую функцию. Просто флаги использовать не достаточно. Вопрос вообще примитивный, не понимаю откуда такое взаимонепонимание. Например: MyClass::MyClass() { if(..нельзя больше создавать объектов..) ConstructedFlag = false; } И что? Конструктор не может что-то вернуть, поэтому при вызове: MyClass *p = new MyClass(); //not construct.. if(!p->ConstructedFlag).... -будет обращение по неверному адресу, т.к. объект не сконструировался. Так что как минимум флаг должен быть статическим, и к нему статический Get Тогда: MyClass *p = new MyClass(); //not construct.. if(! MyClass::GetConstructedFlag) -уже лучше, но не очень логично. И не проще ли тогда в одну строку: if( !(p = MyClass::CreateObject()) ) ...... CreateObject() - не враппер, а статическая функция-фабрика, которая всем рулит. Это позволяет и без try/catch гибко управлять созданием объектов, и не нарушает логическую сущность конструктора/деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 10:36 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым). Class Foo{ char *a1; char *a2; Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...} }; И кто корректно освободит а1 и а2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 11:21 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpace MyClass *p = new MyClass(); //not construct.. if(!p->ConstructedFlag).... -будет обращение по неверному адресу, т.к. объект не сконструировался. Мне, кажется что в случае сиситемной ошибки создания объекта, нью вернет нул. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 11:34 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
nikname Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым). Class Foo{ char *a1; char *a2; Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...} }; И кто корректно освободит а1 и а2 ? Мона разрушать в самом конструкторе, мона в диструкторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 11:36 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
nikname Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, ОГОВАРИВАЕТСЯ, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым). Class Foo{ char *a1; char *a2; Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...} }; И кто корректно освободит а1 и а2 ? читай ВНИМАТЕЛЬНЕЕ что я написал, Ok ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 12:22 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Просто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Впринципе то же самое можно сделать и через исключения. За утечкой памяти надо следить всегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 12:58 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Sandro_KПросто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции Мне нравится эта мысль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 13:08 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Или перегрузить оператор New под потребности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2006, 13:23 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
>Просто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции - именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 06:56 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpace- именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие Теперь стало понятно. Дело в том, что синглетон сюда никаким боком не вписывается. Если у коровые есть хвост, это еще не значит, что она похожа на удава. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 09:53 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
А чем спасёт приватный конструктор? Все проблемы останутся же? Разве что создаваться будет одним пинком? class FooMake{ Foo* Make(){ ... } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 11:20 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
niknameА чем спасёт приватный конструктор? Все проблемы останутся же? Разве что создаваться будет одним пинком? class FooMake{ Foo* Make(){ ... } } Не останутся. Объекта не будет, если произойдет системная ошибка или ошибка выполнения конструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 11:35 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Эка каша в головах!!! TopSpace> именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие Во первых это не синглетон, называется это factory method/ Во вторых к вопросу топика он отношения не имеет. Это здорово подойдет тому парню который собирается кроссплатворменно читать содержимое директорий. Делается абстракный класс для чтения и у него статическая производящая функция, в поддиректориях для каждой платформы своя реализация этого абстрактного класса и произвдящей функции которая создает нужную реализацию и никаких ifdef, все if переносятся в make или в configure А здесь он не уместен хотя бы потому что нельзя узнать в чем причина ошибки. Когда есть exception можно попробовать сказать what, когда есть опрос состояния объекта то он обычно не двузначный... Ну с errno тоже понятно... Другое дело что не надо смешивать мх и котлет. Если ваш класс цепляется к иерархии где принято выбрасывать исключение - надо работать с исключениями(не успеешь конструкторе проинициализировать флажок, если папа выплюнет исключение). Ежели иерархия построена для работы со флажками состояний - волей-неволей придется работать со флажками. Ежели пишешь совсем новую - надо придерживаться принципов команды. А еще можно попробовать написать чтоб и с исключениями и с флажками, в зависимости как собираешься. пробовал - не понравилось.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2006, 15:07 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Согласен, это factory method, просто все паттерны не помню. Насчет следования одной выбранной линии (флажки / кэтчи...) - тоже вопрос бесспорный. Сутью идеи, которой я придерживаюсь, если отрешиться от терминологии, является ПРОВЕРКА ВОЗМОЖНОСТИ КОНСТРУИРОВАНИЯ ОБЪЕКТА НЕ В КОНСТРУКТОРЕ (КОГДА В НЕКОТОРОМ СМЫСЛЕ "УЖЕ ПОЗДНО"), А ВНЕ ЕГО (ПРЕСЛОВУТЫЙ ФАКТОРИ-МЕТОД). А называйте как хотите:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 13:15 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
одно, но. Вне конструктора код может понятия не иметь о возможности создания объекта. В этом случае, исключения - то что доктор прописал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 13:24 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceСогласен, это factory method, просто все паттерны не помню. Насчет следования одной выбранной линии (флажки / кэтчи...) - тоже вопрос бесспорный. Сутью идеи, которой я придерживаюсь, если отрешиться от терминологии, является ПРОВЕРКА ВОЗМОЖНОСТИ КОНСТРУИРОВАНИЯ ОБЪЕКТА НЕ В КОНСТРУКТОРЕ (КОГДА В НЕКОТОРОМ СМЫСЛЕ "УЖЕ ПОЗДНО"), А ВНЕ ЕГО (ПРЕСЛОВУТЫЙ ФАКТОРИ-МЕТОД). А называйте как хотите:) на самом деле, есть настоятельные рекомендации не использовать захват ресурсов в конструкторе...в конструкторе должна быть инициализация переменных, а не захват.в таком случае - будет просще... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 14:12 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
А что подразумевается под захватом ресурсов в конструкторе??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 14:30 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpaceА что подразумевается под захватом ресурсов в конструкторе??? аллокация памяти, открытие сокетов, хэндлеров и прочее... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 14:32 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
2kolobok0: ну да. логично. пусть метод фабрики и захватывает, если нужно, к нему припаять еще метод разрушения. По-моему только сравнительно простые классы могут быть выполнены по класической схеме конструктор/деструктор, а на деле часто возникают различные требования к процессу создания объектов. А вот интересно, тот же Singleton запретит создавать 2-й объет в рамках того же приложения, но он ведь не отследит этого в другом процессе? а если вообще в системе экземпляр должен быть уникален, то придется тогда юзать мьютексы и т.п.???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2006, 16:09 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
TopSpace2kolobok0: ну да. логично. пусть метод фабрики и захватывает, если нужно, к нему припаять еще метод разрушения. По-моему только сравнительно простые классы могут быть выполнены по класической схеме конструктор/деструктор, а на деле часто возникают различные требования к процессу создания объектов. А вот интересно, тот же Singleton запретит создавать 2-й объет в рамках того же приложения, но он ведь не отследит этого в другом процессе? а если вообще в системе экземпляр должен быть уникален, то придется тогда юзать мьютексы и т.п.???? 1)не обязательно метод фабрики... может метод и инишалайз какой нить иметься... 2) если подымаемый объект внутри Вашего процесса - да придёться юзать объекты синхронизации "видимые" через процессорное пространство. 3) Если подымаемый объект не находиться внутри Вашего процесса (например в оутпрок серваке) - то сам по себе он будет жить в рамках одного процесса (сервака), где решить проблемы уникальности мона и более простыми средствами. (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2006, 14:13 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Не, таки вы посмотрите что делается. До чего дошел прогресс kolobok0 TopSpaceА что подразумевается под захватом ресурсов в конструкторе??? аллокация памяти, открытие сокетов, хэндлеров и прочее... (круглый) TopSpace2kolobok0: ну да. логично. пусть метод фабрики и захватывает, если нужно, к нему припаять еще метод разрушения. По-моему только сравнительно простые классы могут быть выполнены по класической схеме конструктор/деструктор, а на деле часто возникают различные требования к процессу создания объектов. Ну- разделите мне аллокацию и инициализацию для след иерархии class A { public: A() { ptr = malloc(256); memset(ptr, 0, 256); } private: void* ptr; }; class B : public virtual A {...}; class C : public virtual A {...}; class D : public A, public B {...}; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2006, 12:34 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
blindedНу- разделите мне аллокацию и инициализацию для след иерархии ... Эээ, а вам по моему как раз и сказали "а вы так не делайте" (c) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2006, 13:14 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
blindedНе, таки вы посмотрите что делается. До чего дошел прогресс ... угумс...лет дцать назад... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2006, 19:15 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) blindedНу- разделите мне аллокацию и инициализацию для след иерархии ... Эээ, а вам по моему как раз и сказали "а вы так не делайте" (c) ну так я и не предлагал делать. Просто не хотелось быть голословным.... kolobok0 blindedНе, таки вы посмотрите что делается. До чего дошел прогресс ... угумс...лет дцать назад... (круглый) Мы будем -бип- меряться или все же разделим аллокацию и инициализацию в предложенном примере. или вы готовы сдаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2006, 21:06 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
blinded...Мы будем -бип- меряться или все же разделим аллокацию и инициализацию в предложенном примере. или вы готовы сдаться? 1) что есть "-бип-" 2) "сдаться" - это как ? молодой человек - не трахайте мозги. Вам выдали решения. Вы не поверили, не захотели, не пожелали, посчитали унизительным и т.д.. Вас направить к книжкам - Вы, и туда же не пойдёте. Ну и смысл ? Ради того что бы "сдаться" или "не сдаться" ? Если Вы так ставите вопрос - я сдаюсь. Заранее и без поворотно. Для моих знаний, умений и тысяч инсталяций в различных странах мира - это как то фиолетово... удачи Вам (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2006, 15:05 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
Sandro_KПросто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Только это не работает, так как флаг в самом объекте хранить нельзя (он м.б. не создан вместе с объектом класса). Предлагаю альтернативу: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 16:56 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
BeSSoRioN пишет: > class A > { > private: > A() > { > ...... > if( нельзя создать объект) Это в принципе неправильно. Конструктор объект не создает, а инициализирует. Поэтому несоздать объект он принципиально не может. А решается такое просто - в объекте заводится флаг валидности, который запрещает все действия с объектом если что. Ну и возможность проверить его надо иметь. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2007, 18:36 |
|
||
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#18+
BeSSoRioN ... Только это не работает, так как флаг в самом объекте хранить нельзя (он м.б. не создан вместе с объектом класса). ... Или как вариант - использовать статический флаг Почему флаг нельзя хранить в объекте, помоему его именно в объекте и надо хранить? Вообще топику уже год, почему его вдруг решили опять поднять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2007, 12:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2028312]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 537ms |

| 0 / 0 |
