1

変なタイトルですみません、思いついたらもっといいタイトルを考えてください。

これが私の問題です。

次のような構造があります。

QObject -> MyBase -> MyDerived

次に、派生型のいずれかを QPointer として受け取る関数があります。

void function(QPointer<MyBase> base) {
   ...
}

QPointer<MyDerived>問題は、この関数に渡すことができないことです。これは、標準のポインターを使用した場合です。関数に適合させるために、このオブジェクトをキャストする必要がありますか? それとも、通常のポインターを使用する必要がありますか?

また、失敗したオブジェクトを割り当てるときの標準的な動作を知っている人はいますか? これを常にtryブロックで行うか、何かでラップしてnullかどうかを確認する必要がありますか? Qtのドキュメントを読んだところ、割り当てに失敗した場合、ほとんどのクラスがnull値を返すとのことでした。try-catch を使用したくない場合はどうすればよいですか?

4

2 に答える 2

7

通常のポインターを使用する必要があります。これは、Qt DocumentがQPoinerの使用について述べていることです

「保護されたポインターは自動的に T * にキャストされるため、保護されたポインターと保護されていないポインターを自由に混在させることができます。これは、QPointer<QWidget> がある場合、QWidget * を必要とする関数に渡すことができることを意味します。このため、 、QPointer をパラメーターとして受け取る関数を宣言する価値はほとんどありません。* 通常のポインターを使用するだけです* 時間をかけてポインターを格納する場合は、QPointer を使用してください。"

于 2012-03-16T03:55:45.503 に答える
0

@Kunalが述べたように、あなたの場合は生のポインターを渡す方が良いですが、ポインターの所有権の問題が発生しているようです。オブジェクトのメソッドに生のポインターを渡すのは危険です。コード ベースが大きくなると、どのオブジェクトがその特定のポインターの所有者であるかがすぐにわからなくなり、メモリ リークが非常に簡単に発生する可能性があるためです。そのため、QPointer または生のポインターの代わりに QSharedPointerを使用することをお勧めします。QSharedPointer はポリモーフィズムをサポートしているため、所有権を気にすることなく、必要な関数/オブジェクトに (値として) 渡すことができます。これは、QSharedPointer がポインターの所有権を取得し、QSharedPointer の最後のインスタンスがすべて移動したときにポインターを削除するためです。範囲外。

于 2012-03-17T09:11:15.307 に答える