powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
25 сообщений из 58, страница 1 из 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
25 сообщений из 58, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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