4

数日間共有ポインタを理解しようとしていて、理解できないようです。当たり前のことなのか、複雑すぎるのかわからない。まず、共有ポインタを実際に使用する例を教えてください。ウィキペディアの例は私には意味がありません。また、共有ポインターを別の関数に渡す方法や、共有ポインターを使用してオブジェクトを作成する方法を教えてください。それで、どのようにそれを回し、どこでそれを使用しますか?どんな情報や例でも素晴らしいでしょう。

また、何を使用すればよいかわからないという問題があります。この関数を使用して、を割り当て、QFileそれを別のクラスの関数に渡します。この関数は、ファイルをとして受け取り、ファイルをQIODevice*含むオブジェクトを作成します。私はここで最良の解決策は何であり、(もし私がそうすべきなら)ここで共有ポインタをどのように使用するのか疑問に思いましたか?<QFile>で共有ポインタを作成し、関数が取る場所に渡すにはどうすればよいですか<QIODevice>。共有ポインタをまったく取得していないように感じます...

QFile私の他のアプローチは、の割り当てをに入れることQScopedPointerです。次に、それをクラスに渡し、ファイルが保存されるオブジェクトを作成するときに、QPointerまたはを使用しますQScopedPointer。最初の呼び出し関数の最後に、take()を呼び出す必要がありますか?

function () {
   QScopedPointer<QFile> item(new QFile("filename"));
   SomeClassObject->doStuff(item.data());
   item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice *item) {
    _currentObject = new MyObject(item); // should _currentObject be a smartpointer?
    ...
}
---------------------------------
class MyObject {
    QPointer<QIODevice> _item;

    ...
    MyObject(QIODevice *item) {  _item = item; }
}

したがって、ポインタを格納する方法と、「new」が例外をスローした場合に作成中にポインタを処理する方法が必要です。

4

1 に答える 1

9

共有ポインター (およびポインターの他の同様のラッパー) のポイントは、ポインターへのオブジェクトの破棄を適切に処理することです。これは、手動で最後のコピー (および最後のコピーのみ) を削除することを確認する必要がある代わりに、共有ポインターが範囲外になったときにそれを処理します。共有部分とは、このラッパー オブジェクト (共有ポインター オブジェクト) のコピーを作成できることを意味し、コピー間で (通常のポインターのコピーを作成した場合と同様に) ポインターへのオブジェクトを "共有" し、追加の利点があります。上で説明した。

あなたのコードに関しては、あなたがそれに渡すときに、その型を持つパラメータ(1の代わりに)がSomeClass::doStuff()必要QScopedPointer<QFile>です。QIODevice*item

のコンストラクターと同じです:または型MyObjectのパラメーターを取ります。一般に、ポインターを使用する場所では、代わりに (適切なテンプレート タイプを使用して) 使用します。これにより、後で削除されたオブジェクトへのアクセスに関連する頭痛から解放されます。QPointer<QIODevice>QSharedPointer<QIODevice>QSharedPointer

もちろん、生のQIODeviceポインターが実際に必要な場合 (サードパーティ ライブラリの呼び出しなど)data()は、共有ポインター オブジェクトのメンバー関数を使用します。共有ポインタの目的を損なうため、返された生ポインタを永続化しないでください (つまり、必要以上に保存またはコピーします)。共有ポインタは、下にない余分な生ポインタを認識しません。共有ポインタ オブジェクトの管理。

編集: take()スコープ付きポインターからポイント先のオブジェクトの所有権を解放するため、スコープ付きポインターが破棄されても、オブジェクトは削除されません。あなたの場合のように、所有権を他の何かに譲渡したときの状況では、それを使用することはできませんMyObject

于 2012-03-23T02:09:59.533 に答える