Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> существование объекта 
:(
    Опции темы
_hunter
  Дата 25.11.2003, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Как проверить существование объекта?
( в Delphi была функция assigned() )

Заранее спасибо за ответ.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
shedon
Дата 25.11.2003, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



можно и так: ASSERT_VALID(pOb)


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Alexander777
Дата 27.4.2007, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 31.12.2006

Репутация: нет
Всего: нет



Но ASSERT_VALID прерывает выполнение программы и выдаёт сообщение. А как проверить существование объекта без прерывания программы?
PM MAIL   Вверх
Daevaorn
Дата 27.4.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Alexander777 @  27.4.2007,  01:57 Найти цитируемый пост)
А как проверить существование объекта без прерывания программы?

Какого именно объекта?
Объект на стеке:
Код

class Foo
{
//...
};

//...
Foo bar;
//здесь уже объект существует.
 
В динамической памяти сложнее. Можно определить сразу после создания
Код

Foo* bar = new Foo;
//здесь уже объект существует.


Цитата(_hunter @  25.11.2003,  13:09 Найти цитируемый пост)
 в Delphi была функция assigned() 

в С++ и Delphi "разные" объекты. В Delphi все объекты(инстансы класса) ссылки, поэтому там и есть эта функция.
PM MAIL WWW   Вверх
Earnest
Дата 27.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



В общем случае - никак.
Можно попробовать завести в объекте спец. поле, заполнять его спец. значением, а на деструкторе чистить, и надяться, что "случайно" в этой памяти нужное значение не окажется. Но всегда есть риск, обратившись к освобожденной памяти, получить исключение. Опять же, это вовсе не обязательно.

Если знать такое критически необходимо, нужно, чтобы объекты (конкретного класса или ветви иерархии) сами себя регистрировали. Например:

Код

// объявление:
class WiseObj
{
public:
   WiseObj()   { Register (this); }
  ~WiseObj() { Unregister (this); }

   static bool IsValid (const WiseObj*);

private:
   static void Register();
   static void Unregister();
};

// реализация:
static std::set<WiseObj*> _Registry;

void WiseObj::Register (WiseObj* pObj)
{
   _Registry.insert (pObj);
}

void WiseObj::Unregister (WiseObj* pObj)
{
   _Registry.erase(pObj);
}

bool WiseObj::IsValid (const WiseObj* pObj)
{
   return _Registry.find (pObj) != _Registry.end();
}


Что-то типа этого.

Добавлено через 2 минуты и 58 секунд
Естественно, регистрировать себя дожны все конструкторы, включая конструктор копирования (если нужен). Т.е. никаких генерируемых компилятором конструкторов. Кроме того, реестр лучше сделать не статиком, а синглетоном, чтобы не зависеть от момента его инициализации.


--------------------
...
PM   Вверх
Ken
Дата 28.4.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: 2
Всего: 4



Кажется assigned () в делфи просто проверяет является ли указатель не-nil  или нет. То же самое вы можете делать в С++, если при удалении всегда будете присвоить 0 на указатель. Более элегантное решение: умные указатели.
PM MAIL   Вверх
HappyLife
Дата 28.4.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 3
Всего: 8



Хотел сказать тоже самое.
Присвайивайте при объявление указателя, нуль и при удалении нуль.
PM MAIL   Вверх
Rockie
Дата 28.4.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(HappyLife @  28.4.2007,  09:30 Найти цитируемый пост)
Присвайивайте при объявление указателя, нуль и при удалении нуль.

+1

Добавлено через 1 минуту и 34 секунды
Ken, +1 smile




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Любитель
Дата 28.4.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Собсно дельфи это делает. Сброс в nil идёт на уровне компилера. Правда это верно для объектов, а вот для произвольных динамических данных - отнюдь нет.


--------------------
PM MAIL ICQ Skype   Вверх
Ken
Дата 28.4.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: 2
Всего: 4



Вы можете легко релизовать такое поведение в С++, например через макросы: 
Код

#define assigned(ptr) (ptr == NULL)
#define deleteImproved(ptr) { delete ptr; ptr = NULL; }


Тогда для удаления объекта можете написать:
Код

deleteImproved (foo);


Макропроцессор будет генерировать:
Код

{ delete foo; foo = NULL; }


И assigned будет работать как в дельфи.

Это сообщение отредактировал(а) Ken - 28.4.2007, 17:57
PM MAIL   Вверх
mr.Anderson
Дата 28.4.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Код

class Foo {
 ...
};
//------------------------------------

Foo myObj;

...

if( myObj != NULL )
 //объект существует
else //не существует



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Daevaorn
Дата 28.4.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



mr.Anderson, уверен?
PM MAIL WWW   Вверх
JackYF
Дата 28.4.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(mr.Anderson @  28.4.2007,  17:54 Найти цитируемый пост)
if( myObj != NULL )

В этом коде не выполнится никогда. См. посты выше. Объект на стеке всегда существует до времени выхода из области видимости.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 28.4.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Да не то что не выполнится - скорее всего и не скомпилится. Если мы сравнение/приведение не перегружали.


--------------------
PM MAIL ICQ Skype   Вверх
Xenon
Дата 28.4.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



И такой код тоже не годится? Тут, по идее, всегда будет выполнятся условие?
Код

Foo* pTr;
pTr = new myObj;
if( myObj != 0 ) ...



--------------------
user posted image  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.