|
|
|
Удаление объекта в конструкторе
|
|||
|---|---|---|---|
|
#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 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33954518&tid=2028312]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
177ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 505ms |

| 0 / 0 |
