Russian Qt Forum
Май 15, 2024, 13:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как узнать создан ли объект ?  (Прочитано 8985 раз)
izoomer
Гость
« : Март 04, 2007, 20:50 »

в заголовочном файле есть
Код:

private:
QLabel * _label;

а в реализации требуется по первому событию создавать объект _label , а по второму удалять ... так вот, можно ли обойтись без создания флага дополнительного , то есть можно ли определить, создан ли уже обект , то есть создали ли уже объект строкой типа
Код:

              _label = new QLabel (this);

что бы не делать delete для пустого объекта, что соответсвенно вызовет ошибку.
Записан
gelo
Гость
« Ответ #1 : Март 04, 2007, 21:49 »

Сравнить _label с NULL?
Записан
izoomer
Гость
« Ответ #2 : Март 04, 2007, 22:06 »

Цитата: "gelo"
Сравнить _label с NULL?

точно ! спасибо
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Март 05, 2007, 02:16 »

Цитата: "izoomer"

что бы не делать delete для пустого объекта, что соответсвенно вызовет ошибку.


Это не вызовит ошибку.  Проверка на NULL есть в самом операторе delete. Вот что печатают в MSDN:

Цитировать
You can use delete on a pointer with the value 0.


Тож самое пишет и Страуструп.

Так что, код

Код:

if (_label) {
    delete _label;
    _label = 0;
}


эквивалентен

Код:

delete _label;
_label = 0;


за исключение того, что первый вариант избыточен.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
izoomer
Гость
« Ответ #4 : Март 05, 2007, 13:04 »

Цитата: "pastor"
Цитата: "izoomer"

что бы не делать delete для пустого объекта, что соответсвенно вызовет ошибку.


Это не вызовит ошибку.  Проверка на NULL есть в самом операторе delete. Вот что печатают в MSDN:

Цитировать
You can use delete on a pointer with the value 0.


Тож самое пишет и Страуструп.

Так что, код

Код:

if (_label) {
    delete _label;
    _label = 0;
}


эквивалентен

Код:

delete _label;
_label = 0;


за исключение того, что первый вариант избыточен.


спасибо за разъеснения, буду читать внимательней теперь.
Записан
Alex03
Гость
« Ответ #5 : Март 05, 2007, 13:51 »

Цитата: "izoomer"
а в реализации требуется по первому событию создавать объект _label , а по второму удалять ... так вот


Немного не в тему..., но может тот случай Улыбающийся
Иногда проще/выгодней создать и удалить один раз, также как и всё остальное. А для показа/непоказа вызывать show()/hide().
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Март 05, 2007, 14:43 »

Guarded pointers are useful whenever you need to store a pointer to a QObject that is owned by someone else and therefore might be destroyed while you still hold a reference to it. You can safely test the pointer for validity.
Example:

Код:

        QGuardedPtr<QLabel> label = new QLabel( 0, "label" );
        label->setText( "I like guarded pointers" );

        delete (QLabel*) label; // simulate somebody destroying the label

        if ( label)
            label->show();
        else
            qDebug("The label has been destroyed");
   
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #7 : Март 05, 2007, 15:01 »

А еще лучше
QLabel * lab = dynamic_cast<QLabel *>(_label);
if ( lab )
{

}
else
{

}

dynamic_cast возвратит указатель либо 0;
Записан
QCasper
Гость
« Ответ #8 : Март 05, 2007, 15:05 »

Цитата: "Mikhail"
А еще лучше
QLabel * lab = dynamic_cast<QLabel *>(_label);
if ( lab )
{

}
else
{

}

dynamic_cast возвратит указатель либо 0;


тогда уж qobject_cast...
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 586


Просмотр профиля
« Ответ #9 : Март 05, 2007, 16:36 »

Полностью согласен. Так еще лучше
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Март 05, 2007, 17:49 »

dynamic_cast не будет работать, если _label изначально не проинициализирован хотя бы нулевым указателем, так что QGuardedPtr всё равно лучше Улыбающийся
Записан
Вудруф
Гость
« Ответ #11 : Март 07, 2007, 08:14 »

Цитировать
Сравнить _label с NULL?

С нулём, тогда уж. Ибо 0 - это нулевой указатель (который может не совпадать побитово с нулём целого типа), а NULL - макрос, который то самое и обозначает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.