Russian Qt Forum

Qt => Общие вопросы => Тема начата: izoomer от Март 04, 2007, 20:50



Название: как узнать создан ли объект ?
Отправлено: izoomer от Март 04, 2007, 20:50
в заголовочном файле есть
Код:

private:
QLabel * _label;

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

              _label = new QLabel (this);

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


Название: как узнать создан ли объект ?
Отправлено: gelo от Март 04, 2007, 21:49
Сравнить _label с NULL?


Название: как узнать создан ли объект ?
Отправлено: izoomer от Март 04, 2007, 22:06
Цитата: "gelo"
Сравнить _label с NULL?

точно ! спасибо


Название: Re: как узнать создан ли объект ?
Отправлено: pastor от Март 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;


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


Название: Re: как узнать создан ли объект ?
Отправлено: izoomer от Март 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;


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


спасибо за разъеснения, буду читать внимательней теперь.


Название: Re: как узнать создан ли объект ?
Отправлено: Alex03 от Март 05, 2007, 13:51
Цитата: "izoomer"
а в реализации требуется по первому событию создавать объект _label , а по второму удалять ... так вот


Немного не в тему..., но может тот случай :)
Иногда проще/выгодней создать и удалить один раз, также как и всё остальное. А для показа/непоказа вызывать show()/hide().


Название: как узнать создан ли объект ?
Отправлено: Alex Custov от Март 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 от Март 05, 2007, 15:01
А еще лучше
QLabel * lab = dynamic_cast<QLabel *>(_label);
if ( lab )
{

}
else
{

}

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


Название: как узнать создан ли объект ?
Отправлено: QCasper от Март 05, 2007, 15:05
Цитата: "Mikhail"
А еще лучше
QLabel * lab = dynamic_cast<QLabel *>(_label);
if ( lab )
{

}
else
{

}

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


тогда уж qobject_cast...


Название: как узнать создан ли объект ?
Отправлено: Mikhail от Март 05, 2007, 16:36
Полностью согласен. Так еще лучше


Название: как узнать создан ли объект ?
Отправлено: Alex Custov от Март 05, 2007, 17:49
dynamic_cast не будет работать, если _label изначально не проинициализирован хотя бы нулевым указателем, так что QGuardedPtr всё равно лучше :)


Название: как узнать создан ли объект ?
Отправлено: Вудруф от Март 07, 2007, 08:14
Цитировать
Сравнить _label с NULL?

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