7

Qobjects は値ではなく ID であると想定されていることを知っています。たとえば、それらをコピーすることはできず、qt のドキュメントで説明されているように、デフォルトではコピー コンストラクターと割り当てが無効になっています。しかし、クローン メソッドを使用して、既存の QObject から新しい QObject を作成することは可能ですか? これは論理エラーでしょうか? 私が言うなら

QObject b; 
QObject a; 
b.cloneFrom(a);

また

QObject a = new QOBject();
QObject b = new QOBject();
b->cloneFrom(a);

clone メソッドはメンバーなどのものをコピーしますが、これは間違っていますか?

これでよければ、それを行う独自のコピー コンストラクターと代入演算子を作成できますか?

注: 実際には、qobject を継承するクラスでこれを試してみたいと思っています。

4

2 に答える 2

8

私の意見では、QObjects のクローン作成は、ほとんどの場合意味的に壊れており、既に述べたように「アイデンティティ」を持っているため、望ましくない副作用につながります。したがって、クローンを作成すると、信号/スロット接続や動的プロパティなど、QObject に関するすべての前提が崩れます。複製するオブジェクトが本当に QObject である必要があるかどうか、または複製したい「値の部分」を除外できるかどうかを検討する必要があります。

また、複製は QObject の特定のサブクラスに対してのみ意味があり、QObject 自体 (実際の「値のような」プロパティを持たない) に対しては意味がありません。

また、A; B; A.cloneFrom( B ) は、B が B 自体ではなく B のサブクラスのインスタンスである場合は機能しないため、壊れているように見えます。クローンは、仮想 B* B::clone() const を介して実行する必要があります。

于 2010-05-18T09:47:30.400 に答える
6

この場合のベストプラクティスは、QObject間でコピーするデータを使用してクラスを作成することだと思います。このクラスは、QObjectまたはQObjectから派生したクラスから派生させないでください。そして、このクラスは「値コンテナ」になります。この場合、あなたは本当に良い方法であなたの問題を解決することができるはずです。

もう1つのヒント:このクラスでは、コピーオンライトで暗黙的なデータ共有を使用して、不要なコピーのオーバーヘッドを減らすことができます:http: //doc.qt.io/qt-5/implicit-sharing.html

于 2010-05-18T09:46:43.023 に答える