QTフォームが有効かどうかを知る方法
-
22-12-2019 - |
質問
現在、QmainWindowから派生した `foo 'というQtフォームクラスを持っています。
今何人かのクラスではこのようなものがあります
class someclass
{
private:
foo* form;
......
public:
someclass()
{
form = NULL;
}
};
.
これが指している場合にFoo *が有効であるかどうかを知る必要があるソンドリスのメソッドがあります 有効なFooフォームに。私はこれを達成するための最良の方法が何であるかを知りたかった。私は
と一緒に行くべきですif(form!=NULL) {...}
.
問題は、上記の方法が信頼できる有効な形式をGuranteeにしないことです。任意の提案?
解決
私はあなたがスマートポインタを探していると思います。通常、このチェックは弱いポインタによって行われます。これはオブジェクトの所有権を保持しませんが、 isNull()メソッド
QTには、 qweakpointer と呼ばれる便利なクラスが確立されています。これは通常、共有ポインタとペアで使用されます。これは QSharedPointer QTの世界。
QWEAKPOINERクラスは、共有ポインタ
への弱い参照を保持していますQWEAKPOINERERは、C ++のポインタへの自動弱い参照です。ポインタを直接参照するために使用することはできませんが、ポインタが別のコンテキストで削除されたかどうかを確認するために使用できます。
QWeakPointerオブジェクトは、QsharedPointerからの割り当てによってのみ作成できます。
これは、オブジェクトを所有しているメインQSharedPointerが参照されているポインタを削除したかどうかを確認するために実際に使用できる方法です。
BOOL QWEAKPOINETER :: isNull()const
このオブジェクトがNULLポインタへの参照を保持している場合はtrueを返します。
弱い参照の性質上、QWEAKPOINEERの参照が常にNULLになる可能性があるため、この関数から返される値は、次の呼び出しから1つの呼び出しまでfalseからtrueに変わる可能性があります。
このように、他のクラスは所有権を持つポインタへの参照を取得する必要はありませんが、あなたの正確なユースケースによっては、QSharedPointerをどこにでも行くことができます。
他のヒント
foo *の代わりにfooクラスの範囲によっては、QScopeDpointerまたはQSharedPointerを使用してください。それは、ポインタが有効であるかどうか確実にチェックを確認し、NULLへのポインタを比較することは野生に指している削除されたポインタを検出するのに役立ちません。