11

私が取り組んでいるクラスでは、いくつかQListの をジャグリングしています。Qt は可能な限りリストのディープ コピーを作成しないと聞いています。私が理解していることから、これは、これを行うとディープコピーが発生しないことを意味します:

QList<int> myList;
myList << 1 << 2 << 3 << 4;
QList<int> otherList = myList;  // No deep copy

場合によっては、 へのディープ コピーが発生しないようにする必要がありQListます。作業中のファイルにディープ コピーが発生しないようにするために、正確にどのような種類の操作またはアクションを回避する必要がありQListますか?

4

3 に答える 3

13

QList は、暗黙的な共有を使用して実装されます。

暗黙的に共有されたオブジェクトのオブジェクト割り当て (operator=() を使用) は、浅いコピーを使用して実装されます。

つまり、割り当てだけでは、含まれているデータがコピーされることはありません。ただし、共有インスタンスに書き込むとソース オブジェクトがコピーされます。このパターンは、一般にコピー オン ライトとして知られています。

したがって、あなたの質問に答えるために、共有インスタンスに書き込みをしないと、コピーされることはありません。コピーが作成されるのを完全に防ぎたい場合は、QList から派生させ、コピー コンストラクターと代入演算子をオーバーライドして非表示にします。

于 2011-07-28T22:00:50.257 に答える
2

関数の引数として QList を渡す場合、または Qt を変更せずにコピーを作成する場合、「ラッパー」を渡すだけでは、実際のデータはコピーされません。暗黙的な共有は、Flyweight パターンの Qt 実装です。こちらを参照してください。

于 2011-07-29T01:15:31.027 に答える