2014-01-10 5 views
2

В настоящее время у меня есть класс формы Qt, называемый `foo ', полученный из QMainWindow.Как узнать, является ли форма Qt действительной

Теперь в каком-то другом классе у меня есть что-то вроде этого

class someclass 
{ 
    private: 
     foo* form; 
    ...... 
    public: 
     someclass() 
     { 
      form = NULL; 
     }  
}; 

В настоящее время существует метод SomeClass, что нужно знать, если Foo * является действительным, если он указывает к действительной форме Foo. Я хотел знать, что было лучшим способом добиться этого. Должен ли я идти с

if(form!=NULL) {...} 

Проблема в том, что вышеуказанный метод не гарантирует надежную действительную форму. Какие-либо предложения ?

+0

@Charles: не удаляйте теги, которые имеют отношение к теме. Вы не только набросаете вопрос, но и удаляете Q/A из категории, к которой он относится. – lpapp

+0

@ Laszlo, я собирался ударить вас множеством ссылок Meta, которые демонстрируют, что вы не должны добавлять теги библиотеки к вопросам, к которым тег будет применяться только к ответу, но я, по-видимому, полностью забыл предыдущий консенсус сообщества. Приносим извинения за неудобства, вызванные моим правым тегом. – Charles

+0

@Charles: Не стоит беспокоиться. – lpapp

ответ

1

Я думаю, что вы ищете умные указатели. Обычно эта проверка выполняется слабым указателем. Это не будет владеть объектом для объекта, но оно может проверить действительность с помощью isNull() method.

У Qt есть удобный для этого класс, который называется QWeakPointer. Обычно он используется в паре с общим указателем, который будет QSharedPointer в мире Qt.

Класс QWeakPointer держит слабую ссылку на общий указатель

QWeakPointer автоматический слабая ссылка на указатель в C++. Он не может использоваться для прямого разыменования указателя, но его можно использовать для проверки того, был ли указатель удален или нет в другом контексте.

Объекты QWeakPointer могут быть созданы только путем назначения из QSharedPointer.

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

BOOL QWeakPointer :: IsNull() Const

Возвращает TRUE, если этот объект держит ссылку на нулевой указатель.

Обратите внимание, что из-за природы слабых ссылок указатель на то, что ссылки QWeakPointer могут стать нулевыми в любой момент, поэтому значение, возвращаемое этой функцией, может изменяться от false до true от одного вызова к другому.

Таким образом, другому классу не нужно было бы ссылаться на указатель с собственностью, но в зависимости от вашего конкретного варианта использования вы могли бы просто искать QSharedPointer везде.

+1

sharedptrs не работают с QObject при передаче родителя (который вы всегда должны делать для диалогов, чтобы не разбивать стекирование окон), поскольку как родительский, так и sharedptr принимают собственность, а sharedptr вызывает двойное удаление в случае, если родительский сначала удаляет. Поэтому я был бы осторожен с такими утверждениями, как «вы могли бы просто искать QSharedPointer везде», в контексте Qt. –

+0

@FrankOsterfeld: Хм, похоже, предполагаемое значение «Везде» не было для вас в этом предложении. :) Он пытается ссылаться на каждое место, такое как: класс, который имеет общий указательный элемент и любой код выхода, доступ к которому. Слово не относится к «каждому сценарию». Fwiw, я даже написал, что «в зависимости от вашего варианта использования», что означает не в каждом сценарии. Не стесняйтесь предлагать предложенное редактирование, если вы думаете, что можете сделать его более ясным, но я думаю, что намерение по-прежнему остается правильным, если нет других проблем. – lpapp

+0

Что касается отношения родителя/ребенка, я не уверен, что это правильный путь в конечном счете и все время, если вы хотите убедиться, что указатель действителен. Я лично считаю, что информация не имеет отношения к намерению ОП. Возможно, ОП просто пытался предоставить как можно больше информации, но в любом случае, я не вижу окончательной проблемы с личным матерями без родителей. Если бы это было так, API, вероятно, запретил бы это. :) – lpapp

1

Используйте QScopedPointer или QSharedPointer в зависимости от области действия класса foo вместо foo *. Это позволило бы надежно проверить правильность указателя, сравнение указателя на нуль не поможет обнаружить удаленный указатель, указывающий на дикую природу.

Смежные вопросы