Как узнать, действительна ли форма Qt

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

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

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

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

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

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

2

Решение

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

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

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

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

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

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

bool QWeakPointer :: isNull () const

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

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

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

1

Другие решения

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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector