powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
58 сообщений из 58, показаны все 3 страниц
Удаление объекта в конструкторе
    #33949036
Edward Mingaziev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта.
при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949063
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привально.
берем переменную - класс, инициализируем, она получает какой-тор адрес.
И тут же удаляем (адрес был получен до входа в конструктор)
Класс становится пустым, а адрес в переменной не NULL
можно попоробоавть this=NULL хотя вряд ли поможет
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949087
Edward Mingaziev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Aklin this=NULL

[C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949100
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут скорее можно прийти к одному из 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 поправьте меня, как верно
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949293
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edward Mingaziev Aklin this=NULL

[C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead

Если есть оператор new так есть и опреатор delete. попробуй их использовать.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949350
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта.
при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе?

Аааааааа

эксцепшен генери, чудо
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949371
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edward Mingaziev Aklin this=NULL

[C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead

Присвоение this-у запрещено стандартом в незапамятные времена
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949395
pandrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИМХО оператор new - это вызов alloc() и далее работа с полученным куском памяти (по типу setmem). Естественно, т.к. внутрь setmem передается указатель на созданный объект, у тебя нет возможности изменить указатель, хоть на уши встань.
Т.о., реально только сгенерировать exeption в конструкторе и перехватив его снаружи вызвать free (деструктор). Либо в конструкторе вызвать деструктор, сгенерить исключение, а при перехвате занулить указатель.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949426
Edward Mingaziev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, придется генерировать exception и заключать каждый new в try, хотель бы конечно сделать попроще
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33949437
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто подумай, что будет если кто-то создаст твой хитрый объект не в хипе, а на стеке.

И все станет ясно

P.S. A new это не токма malloc, но еще и вызов конструктора (то-же касается и деструкторов)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33950892
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот не успел маленького потоптать! Но зайдем с другой стороны, аот в старые добрые времена, когда exception были реализованы мало у кого. Люди заводили понятие состояния объекта (iostream), взводили errno, заводили функцию игнициализации или делали ее отложенной
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33951448
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться... Все требования, предъявляемые к поведению класса, отражаются на СТРУКТУРЕ класса, что и есть паттерны ООП. Можно ли создать еще один объект - за этим должен следить не конструктор, а статическая функция
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33951550
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceПо-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться... Все требования, предъявляемые к поведению класса, отражаются на СТРУКТУРЕ класса, что и есть паттерны ООП. Можно ли создать еще один объект - за этим должен следить не конструктор, а статическая функция

Таким образом, вся Жаба является не правельной и не отражает стуктуру ООП. :)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33951910
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceнеправильно выбрасывать исключения в конструкторе.

Читай классиков. Саттер и Майерс тебе помогут.

К сожалению, альтернативы еще неправильнее (как в случае Subj) или неудобнее (заведение флажков состояния инициализации объекта).
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33952089
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну не сомненно delete из конструктора вызывать нельзя. хотя бы потому что это не логично, объект до конца не построен а вызывается деструктор. Но и выбрасывание исключения не всегда удобно. Уж больно аккуратнным надо быть
чтобы ресурсы не потекли. а конструкция типа
MyClass::MyClass(...) :
try
{
x()
}
catch()
{
...
}
{
..
}
производит на меня неизгладимое впечатление. Кстати про нелюбовь к std::auto_ptr. очень помогает избежать утечек ресурсов...
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33952279
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
auto_ptr не надо любить, им надо пользоваться ПО НАЗНАЧЕНИЮ
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33953137
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объект нельзя удалять в конструкторе. Нужно использовать либо исключение, либо признак. Признак безопаснее, при исключении класс может быть недоконструирован.

class MyClass{
bool bValid;

MyClass();
~MyClass();
bool IsValid(){return bValid;}
...
};
...

MyClass *ptr = new MyClass();

if ( !ptr->IsValid() ) {
delete ptr;
ptr = NULL;
}
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954176
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта.
при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе?

Так делать сугубо противопоказано. Конструктор не создает объект, не выделяет под него память и не знает, в какой памяти находится объект. Поэтому правильно удалить объект в конструкторе невозможно. Если вам нужно просигнализировать о неправильности объекта, вам нужно выкидывать исключение (выкидывание исключения из конструктора -- тема отдельная, веселая) и потом его ловить где- то и что- то делать.
При этом если у вас переменная объекта автоматическая, все удалиться само, если динамическая - тоже. Это самый удобный и правильный вариант.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954177
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceТут скорее можно прийти к одному из DesignPatterns. Почему бы Вам не воспользоваться синглетоном?


При чем здесь синглтон ?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954179
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceПо-момему нельзя (в смысле неправильно) выбрасывать исключения в конструкторе. Хотя бы потому, что они могут и не отлавливаться...

Исключение всегда может не отлавливаться. Чем здесть конструкторы уникальны, не понятно.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954199
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Синглетон как возможный вариант. Там можно создавать лишь один объект класса, если нужно немного другое условие, то модифицируется функция Create (ну назовем это MultiSingleton:). Классика в чем-то уже устарела, и я все-же думаю, что в конструкторе исключения выбрасывать нельзя. Не совсем нельзя, конечно. Если при конструировании возможны ошибки, то тогда ладно. Но если вы хотите регламентировать количество создаваемых объектов, то либо static-функция конструирования, либо флаг и функция проверки.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954289
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В конструкторе исключения бросать МОЖНО (не путать с деструктарами, там действительно нельзя), более того, классики настоятельно рекомендуют именно так и поступать. Разумеется, оговаривается, что так как объект окажется недоконструирован, его деструктор вызван не будет (нужно следить за утечкой ресурсов), но все что насоздавалось а области инициализации, будет корректно разрушено (поэтому тело конструктора должно быть простым и незамысловатым). Не вижу, чем помог бы здесь delete this в конструкторе (если бы это можно было делать), поскольку в момент его вызова объект был-бы точно также НЕДОКОНСТРУИРОВАН как и при бросании исключения (неговоря о том, что на момент выхода из конструктора его статус вообще мне лично был-бы непонятен, а применение этой замечательной технологии к автоматически созданному (или о ужас созданному в другом объекте) объекту привело бы к тому, что отладчик стал бы вашим любимым инструментом, а работа домом).
Лично я в таких случаях применяю флажки (и меня за это бьют). Вопрос личных предпочтений. Исключений, как и любых предоставляемых средств не надо БОЯТСЯ, надо просто ОТЧЕТЛИВО понимать, что и как происходит в вашей программе (если уж вам сподобилось писать на C++). Если для вас это слишком сложно, есть Васик и Шрап.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954371
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Gluk (Kazan): не понимаю, если используется флаг - зачем исключение? а что будет, если бъект будут создавать не в try? Почему нельзя использовать статическую функцию-фабрику? это более логичный интерфейс для конструирования объектов, которые могут быть и не созданы, и не обязывает нас использовать try... никто его не боится, ну просто зачем..
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33954459
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpaceСинглетон как возможный вариант. Там можно создавать лишь один объект класса, если нужно немного другое условие, то модифицируется функция Create (ну назовем это MultiSingleton:). Классика в чем-то уже устарела, и я все-же думаю, что в конструкторе исключения выбрасывать нельзя. Не совсем нельзя, конечно. Если при конструировании возможны ошибки, то тогда ладно. Но если вы хотите регламентировать количество создаваемых объектов, то либо static-функция конструирования, либо флаг и функция проверки.

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

Вас никто не обязывает использовать исключения. Используйте флаги.
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #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
Удаление объекта в конструкторе
    #33967819
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНу- разделите мне аллокацию и инициализацию для след иерархии

...



Эээ, а вам по моему как раз и сказали "а вы так не делайте" (c)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33969251
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНе, таки вы посмотрите что делается. До чего дошел прогресс
...

угумс...лет дцать назад...

(круглый)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33969385
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) blindedНу- разделите мне аллокацию и инициализацию для след иерархии
...

Эээ, а вам по моему как раз и сказали "а вы так не делайте" (c)
ну так я и не предлагал делать. Просто не хотелось быть голословным....

kolobok0 blindedНе, таки вы посмотрите что делается. До чего дошел прогресс
...
угумс...лет дцать назад...
(круглый)
Мы будем -бип- меряться или все же разделим аллокацию и инициализацию в предложенном примере. или вы готовы сдаться?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #33971226
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded...Мы будем -бип- меряться или все же разделим аллокацию и инициализацию в предложенном примере. или вы готовы сдаться?

1) что есть
"-бип-"
2) "сдаться" - это как ?

молодой человек - не трахайте мозги. Вам выдали решения. Вы не поверили, не захотели, не пожелали, посчитали унизительным и т.д.. Вас направить к книжкам - Вы, и туда же не пойдёте. Ну и смысл ? Ради того что бы "сдаться" или "не сдаться" ? Если Вы так ставите вопрос - я сдаюсь. Заранее и без поворотно. Для моих знаний, умений и тысяч инсталяций в различных странах мира - это как то фиолетово...


удачи Вам
(круглый)
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #34748587
BeSSoRioN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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;
        }
    }
};


Только это не работает, так как флаг в самом объекте хранить нельзя (он м.б. не создан вместе с объектом класса). Предлагаю альтернативу:
Код: 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(bool* isConstructed)
    {
        ......
        if( нельзя создать объект)
            *isConstructed = false;
        else
            *isConstructed = true;
    }
public:
    static A* Create()
    {
        bool isConstructed;
        A *tmp = new A(&isConstructed);
        if(isConstructed)  
             return tmp;
        else
        {
            delete tmp;
            return NULL;
        }
    }
};
Или как вариант - использовать статический флаг
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #34748991
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeSSoRioN пишет:

> class A
> {
> private:
> A()
> {
> ......
> if( нельзя создать объект)

Это в принципе неправильно. Конструктор объект не создает, а инициализирует.
Поэтому несоздать объект он принципиально не может.
А решается такое просто - в объекте заводится флаг валидности,
который запрещает все действия с объектом если что.
Ну и возможность проверить его надо иметь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #34750315
Sandro_K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeSSoRioN
...
Только это не работает, так как флаг в самом объекте хранить нельзя (он м.б. не создан вместе с объектом класса).
...
Или как вариант - использовать статический флаг

Почему флаг нельзя хранить в объекте, помоему его именно в объекте и надо хранить?

Вообще топику уже год, почему его вдруг решили опять поднять?
...
Рейтинг: 0 / 0
Удаление объекта в конструкторе
    #34750360
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У MasterZiv дежа-вю. Там по-моему перебрали все возможные вариантыобработки ошибки конструирования объекта
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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