4

Qtのforeach関数に少し問題があります。QListのサブクラスであるPhraseクラスがあります。〜Phraseで、すべてのGlossItemポインターを削除します。

PhraseのGlossItemポインターを反復処理する際に、Qtのforeachを使用したいと思います。

    // phrase is a pointer to a Phrase object, 
    // which is a subclassed QList<GlossItem*>
    foreach( GlossItem *glossItem , *phrase )
    {
        // use glossItem
    }

何らかの理由で、foreachはPhraseでディープコピーを実行しています(コピーコンストラクターを実装する必要があったため、これを知っています)。ただし、Phraseのコピーがあり、各GlossItemの深いコピーを作成したくない場合は、それらのポインターが2回削除されることを意味します。(または、一度削除してからクラッシュします。)したがって、これを使用する必要があります。これは機能しますが、あまりきれいではありません。

    for(int i=0; i<phrase->count(); i++ )
    {
        GlossItem *glossItem = phrase->at(i);
        // use glossItem
    }

これを回避する方法はありますか、それとも私はそれと一緒に暮らす必要がありますか?

4

2 に答える 2

6

ドキュメントから

foreach ループに入ると、Qt はコンテナーのコピーを自動的に取得します。

foreach はコンテナーのコピーを作成するため、変数に const 以外の参照を使用しても、元のコンテナーを変更することはできません。

したがって、特定のユースケースには適していないと思います。それ以外の場合は、必要な実際のオリジナルを返すのではなく、追加のポインターを使用foreachしての新しいコピーになってしまいます。PhrasePhrase

于 2013-01-14T11:38:03.400 に答える
1

いいえ、以下から展開されたコードを見るとforeach: qt.gitorious.org/qt/qt/blobs/HEAD/src/corelib/global/qglobal.h#line2371 const_iterator を使用しています。はい、コンテナーをコピーしますが、Qt のすべてのコンテナー クラスは暗黙的に共有されるため、ディープ コピーではなく、単なる浅いコピーです。

于 2013-01-14T17:55:52.310 に答える