powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
25 сообщений из 58, страница 2 из 3
Удаление объекта в конструкторе
    #33954501
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhВас никто не обязывает использовать исключения. Используйте флаги.

Я и использую ;)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954509
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем..

Трук, исключения это не толька try catch :) Ничего не имею против фабрики классов (пусть даже и статической)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954516
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) AkhВас никто не обязывает использовать исключения. Используйте флаги.

Я и использую ;)

Я тоже. Бекоз очень часто объекты имет свойство, готовы они для продолжения работы или временно развалились.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954518
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) TopSpace2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем..

Трук, исключения это не толька try catch :) Ничего не имею против фабрики классов (пусть даже и статической)

В данном случае против. Ибо нехрен огород городить на пустом месте. Сущности должны быть обоснованы.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954597
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну не совсем враппер, я привел сверху пример. Класс сам управляет созданием своих объектов(это не 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 гибко управлять созданием объектов, и не нарушает логическую сущность конструктора/деструктора.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954767
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым).

Class Foo{
char *a1;
char *a2;

Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...}
};

И кто корректно освободит а1 и а2 ?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954841
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace
MyClass *p = new MyClass(); //not construct..
if(!p->ConstructedFlag)....
-будет обращение по неверному адресу, т.к. объект не сконструировался.


Мне, кажется что в случае сиситемной ошибки создания объекта, нью вернет нул.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954849
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым).

Class Foo{
char *a1;
char *a2;

Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...}
};

И кто корректно освободит а1 и а2 ?

Мона разрушать в самом конструкторе, мона в диструкторе.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33955032
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikname Gluk (Kazan)В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, ОГОВАРИВАЕТСЯ, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым).

Class Foo{
char *a1;
char *a2;

Foo(){ a1 = malloc(100); a2=malloc(200); ... throw(1);...}
};

И кто корректно освободит а1 и а2 ?

читай ВНИМАТЕЛЬНЕЕ что я написал, Ok ?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33955191
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.
class A
{
private:
    A()
    {
        ......
        if( нельзя создать объект)
            isConstructed = false;
        else
            isConstructed = true;
    }
     bool isConstructed;
public:
    static A* Create()
    {
        A *tmp = new A();
        if(isConstructed)  
             return tmp;
        else
        {
            delete tmp;
            return NULL;
        }
    }
};

Впринципе то же самое можно сделать и через исключения. За утечкой памяти надо следить всегда
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33955251
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KПросто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции


Мне нравится эта мысль.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33955311
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или перегрузить оператор New под потребности
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33957206
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Просто конструктор надо сделать приватным и разрешить создавать объект только при помощи статической функции

- именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33957467
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace- именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие

Теперь стало понятно. Дело в том, что синглетон сюда никаким боком не вписывается. Если у коровые есть хвост, это еще не значит, что она похожа на удава. ;)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33957777
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чем спасёт приватный конструктор? Все проблемы останутся же? Разве что создаваться будет одним пинком?

class FooMake{


Foo* Make(){ ... }
}
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33957853
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niknameА чем спасёт приватный конструктор? Все проблемы останутся же? Разве что создаваться будет одним пинком?

class FooMake{


Foo* Make(){ ... }
}

Не останутся. Объекта не будет, если произойдет системная ошибка или ошибка выполнения конструктора.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33958842
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эка каша в головах!!!
TopSpace>
именно это я доказываю уже вторую страницу:) так и работает singleton, только он запрещает создавать второй объект, а тут какое-нибудь другое условие
Во первых это не синглетон, называется это factory method/
Во вторых к вопросу топика он отношения не имеет. Это здорово подойдет тому парню который собирается кроссплатворменно читать содержимое директорий. Делается абстракный класс для чтения и у него статическая производящая функция, в поддиректориях для каждой платформы своя реализация этого абстрактного класса и произвдящей функции которая создает нужную реализацию и никаких ifdef, все if переносятся в make или в configure
А здесь он не уместен хотя бы потому что нельзя узнать в чем причина ошибки.
Когда есть exception можно попробовать сказать what, когда есть опрос состояния объекта то он обычно не двузначный... Ну с errno тоже понятно...
Другое дело что не надо смешивать мх и котлет. Если ваш класс цепляется к иерархии где принято выбрасывать исключение - надо работать с исключениями(не успеешь конструкторе проинициализировать флажок, если папа выплюнет исключение). Ежели иерархия построена для работы со флажками состояний - волей-неволей придется работать со флажками. Ежели пишешь совсем новую - надо придерживаться принципов команды.
А еще можно попробовать написать чтоб и с исключениями и с флажками, в зависимости как собираешься. пробовал - не понравилось....
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33961929
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен, это factory method, просто все паттерны не помню. Насчет следования одной выбранной линии (флажки / кэтчи...) - тоже вопрос бесспорный. Сутью идеи, которой я придерживаюсь, если отрешиться от терминологии, является ПРОВЕРКА ВОЗМОЖНОСТИ КОНСТРУИРОВАНИЯ ОБЪЕКТА НЕ В КОНСТРУКТОРЕ (КОГДА В НЕКОТОРОМ СМЫСЛЕ "УЖЕ ПОЗДНО"), А ВНЕ ЕГО (ПРЕСЛОВУТЫЙ ФАКТОРИ-МЕТОД). А называйте как хотите:)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33961964
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
одно, но. Вне конструктора код может понятия не иметь о возможности создания объекта. В этом случае, исключения - то что доктор прописал
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33962172
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceСогласен, это factory method, просто все паттерны не помню. Насчет следования одной выбранной линии (флажки / кэтчи...) - тоже вопрос бесспорный. Сутью идеи, которой я придерживаюсь, если отрешиться от терминологии, является ПРОВЕРКА ВОЗМОЖНОСТИ КОНСТРУИРОВАНИЯ ОБЪЕКТА НЕ В КОНСТРУКТОРЕ (КОГДА В НЕКОТОРОМ СМЫСЛЕ "УЖЕ ПОЗДНО"), А ВНЕ ЕГО (ПРЕСЛОВУТЫЙ ФАКТОРИ-МЕТОД). А называйте как хотите:)

на самом деле, есть настоятельные рекомендации не использовать захват ресурсов в конструкторе...в конструкторе должна быть инициализация переменных, а не захват.в таком случае - будет просще...

(круглый)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33962274
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что подразумевается под захватом ресурсов в конструкторе???
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33962288
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceА что подразумевается под захватом ресурсов в конструкторе???

аллокация памяти, открытие сокетов, хэндлеров и прочее...

(круглый)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33962749
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2kolobok0: ну да. логично. пусть метод фабрики и захватывает, если нужно, к нему припаять еще метод разрушения. По-моему только сравнительно простые классы могут быть выполнены по класической схеме конструктор/деструктор, а на деле часто возникают различные требования к процессу создания объектов. А вот интересно, тот же Singleton запретит создавать 2-й объет в рамках того же приложения, но он ведь не отследит этого в другом процессе? а если вообще в системе экземпляр должен быть уникален, то придется тогда юзать мьютексы и т.п.????
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33965193
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace2kolobok0: ну да. логично. пусть метод фабрики и захватывает, если нужно, к нему припаять еще метод разрушения. По-моему только сравнительно простые классы могут быть выполнены по класической схеме конструктор/деструктор, а на деле часто возникают различные требования к процессу создания объектов. А вот интересно, тот же Singleton запретит создавать 2-й объет в рамках того же приложения, но он ведь не отследит этого в другом процессе? а если вообще в системе экземпляр должен быть уникален, то придется тогда юзать мьютексы и т.п.????

1)не обязательно метод фабрики...
может метод и инишалайз какой нить иметься...
2) если подымаемый объект внутри Вашего процесса - да придёться юзать объекты синхронизации "видимые" через процессорное пространство.
3) Если подымаемый объект не находиться внутри Вашего процесса (например в оутпрок серваке) - то сам по себе он будет жить в рамках одного процесса (сервака), где решить проблемы уникальности мона и более простыми средствами.

(круглый)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33967653
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, таки вы посмотрите что делается. До чего дошел прогресс
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 {...};
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]