2

質問:コピーコンストラクターではなく、代入演算子を定義できますか?内部クラス(APIで公開されていない)の場合、これはまだ悪い設計手法ですか?

私がそれを必要とする理由この質問が述べているようにQObject、そのコピーコンストラクターと代入演算子をプライベートにして、サブクラスがどちらかを使用しようとすると、コンパイル時にエラーが発行されるようにします。

ただし、「値」(ドキュメントで説明されQobjectいる「ID」ではない)をコピーするには、代入演算子を定義する必要があります。このクラスのコピーコンストラクターはどこにも使用していません。

コピーコンストラクターを作成したくない理由は、とにかく使用しないコードを複製するためです。

4

2 に答える 2

9

あなたを止めるものは何もありません。しかし、それはかなりばかげた考えです。

T t = GetSomeT();

T t;
t = GetSomeT();

最初のものを2番目のものに変換するのは非常に簡単ですが、開発者とプロセッサの両方で私の時間を無駄にしているだけで、私にそれをさせています。それがデフォルトで構築可能でない場合、私はそれがより難しいだろうと思います...しかし、私はまだ要点を理解していません。コピーコンストラクターは、些細な場合はコンパイラーで定義できます。DRYが必要な場合は、代入演算子で定義することもできます。

class T {
    T(const T& ref) {
         *this = ref;
    }
};

コピーコンストラクターがないと、代入演算子を実装するための通常のイディオムであるコピーアンドスワップの機能も阻害されます。

于 2011-07-23T19:10:39.673 に答える
4

可能ではありますが、DeadMGが言うように、それはかなり愚かです。

基本クラスのコピーコンストラクターを独自に呼び出す必要はないため、絶対に値のセマンティクスが必要な場合でも、それは可能です。しかし、QObjectsのコンテキストでは、これはまだかなり非正統的です。自分の内部クラスであっても、驚き最小の原則を念頭に置く必要があります。

どうしても必要な場合は、従来のコピーコンストラクター/代入演算子を避け、メンバー関数を介して作業します。派生物の期待されるセマンティクスはQObject維持されますが、実行したいことを明示的に実行する方法があります。

struct SomeType : QObject {
    QSharedPointer<SomeType> Clone() const;
    //or
    SomeType& CopyValue(const SomeType&);

    //rest of implementation
};
于 2011-07-23T19:55:48.050 に答える