2

クラス B のオブジェクトをメンバーとして参照するクラス A があります。クラス B のコピー コンストラクター (および代入演算子) はプライベートです。A にデフォルトのコピー コンストラクターを使用することは有効で良い考えだと思いますか (実際には、代入機能と割り当て機能の両方を必要とするある種の STL コンテナーに、型 A の多くのオブジェクトを格納できる機能が必要です)。コピー可能。)

class A
{
    private:
        B& b_;

    public:
        A(B& b) : b_(b){}
}

これまでのところ、私の知る限り、上記の方法に対する異議は次のとおりですが、私の設計はそれに直面していません。上記の例について他に問題/問題/懸念があるかどうかを知りたいです...

  1. 参照のみがコピーされるため、タイプ B の元のオブジェクト b が破棄されると問題が発生します。( b はスコープ全体で使用できるため、適用されません。)
  2. b_ は A のすべてのインスタンスで一意ですか? (いいえ、B は実際にはスコープ内で 1 回だけインスタンス化されるため、シングルトン クラスの効果があります。)

他に懸念事項がある場合は、ここに記載してください。私は明示的に定義されたコピーコンストラクターには熱心ではありませんが、それに対して心を開いています。

4

4 に答える 4

2

3 つのルールを確認します。
これら (デストラクタ、コピー コンストラクタ、コピー代入演算子) のいずれかをオーバーロードする必要がある場合は、それらすべてをオーバーロードする必要があります。これらのいずれもオーバーロードしない場合は、コンパイラが生成するデフォルトの関数に依存できます。

于 2011-07-27T16:00:18.727 に答える
2

一般的なガイドラインとして、コピー セマンティクスを無料で取得できないため、オブジェクト内に参照を格納することはありません

代わりにポインタを保存します。ここでは、ダムポインターを保存し、コンパイラーにコピーセマンティクスを実装させて問題ないようです。

class A
{
    B* b; // or a smart pointer, depending on what semantics you want.

public:
    A(B& b) : b(&b) {}
};

ポインターの使用にはある程度の柔軟性があります。たとえば、デフォルトの構築でポインターをゼロに設定し、その後の操作でその有効性をチェックできます (または単にassert)。また、ポインターはリセットできますが、参照の場合はそうではありません。

于 2011-07-27T16:03:37.317 に答える
0

Bの代入演算子がプライベートの場合、コンパイラはAのデフォルトの代入演算子を生成できません。代入演算子を明示的に宣言する必要があります。そうしないと、コンパイルエラーが発生します:http ://msdn.microsoft.com/en-us/library/aa983787%28v=vs.71%29.aspx

それが済んだら、オブジェクトAをSTLコンテナに入れるのに問題はないはずです。

于 2011-07-27T16:13:08.830 に答える
0

あなたは値によって保存しておらずB、ライフタイムの問題を理解しているので(コピーするかどうかに関係なく適用されます)、デフォルトのコピーコンストラクターを使用しても問題ないと思います。

補足として、暗黙的に aを としてA(B&)扱うことを避けるために、コンストラクターを明示的にすることをお勧めします。BA

于 2011-07-27T16:03:07.590 に答える