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

[C++ Error] ConfigClass.cpp(53): E2025 Assignment to 'this' not allowed, use X::operator new instead
...
Рейтинг: 0 / 0
29.08.2006, 12:09
    #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
29.08.2006, 12:52
    #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
29.08.2006, 13:06
    #33949350
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта в конструкторе
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта.
при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе?

Аааааааа

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

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

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

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

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

К сожалению, альтернативы еще неправильнее (как в случае Subj) или неудобнее (заведение флажков состояния инициализации объекта).
...
Рейтинг: 0 / 0
30.08.2006, 12:54
    #33952089
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта в конструкторе
Ну не сомненно delete из конструктора вызывать нельзя. хотя бы потому что это не логично, объект до конца не построен а вызывается деструктор. Но и выбрасывание исключения не всегда удобно. Уж больно аккуратнным надо быть
чтобы ресурсы не потекли. а конструкция типа
MyClass::MyClass(...) :
try
{
x()
}
catch()
{
...
}
{
..
}
производит на меня неизгладимое впечатление. Кстати про нелюбовь к std::auto_ptr. очень помогает избежать утечек ресурсов...
...
Рейтинг: 0 / 0
30.08.2006, 13:37
    #33952279
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта в конструкторе
auto_ptr не надо любить, им надо пользоваться ПО НАЗНАЧЕНИЮ
...
Рейтинг: 0 / 0
30.08.2006, 16:32
    #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
31.08.2006, 05:47
    #33954176
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление объекта в конструкторе
Edward Mingazievпри создании объекта в конструкторе в определенных ситуациях возникает необходимость отменить создание объекта.
при использовании delete this операция new не возвращает NULL хотя деструктор объекта вызывается, может есть какие-либо другие способы отмены создания объекта в конструкторе?

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


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

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

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

Вас никто не обязывает использовать исключения. Используйте флаги.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Удаление объекта в конструкторе / 25 сообщений из 58, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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