2

クラスBのオブジェクトへの参照をメンバとして持つクラスAを持っています。クラスBのコピーコンストラクタ(および代入演算子)はprivateです。 をAのデフォルトのコピーコンストラクタとして使用することは有効で良い考えだと思いますか(実際には、タイプAのオブジェクトを何種類かのSTLコンテナに格納できる機能が必要です。そして、コピー能力。)今までコピー可能なメンバ参照を含むクラスのコピーコンストラクタ

class A 
{ 
    private: 
     B& b_; 

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

、上記の方法に異議がある私の知識では、以下が、私のデザインはそれに直面していません。 BタイプBの元のオブジェクトが破壊されたとき、私は...上記の例に関するいくつかの問題/問題/問題があるかどうかを知るために

  1. のみ参照がコピーされ、したがって、そこであろう問題を希望します。 (bはスコープ全体で利用可能であるため、適用されません)
  2. Aのすべてのインスタンスに固有のb_ですか? (いいえ、Bはスコープ内で実際にインスタンス化されるので、シングルトンクラスの効果があります)

その他の問題がある場合は、ここにリストしてください。私は明示的に定義されたコピーコンストラクタに熱心ではありませんが、私はそれに向かってオープンな心を保っています。

+1

'A'はデフォルトコンストラクタブルではないため、標準コンテナでは使用できません。 –

+1

すべてのstlコンテナで使用するには、デフォルトコンストラクタブルである必要はありません。あなたはc配列のためのデフォルトコンストラクタが必要です –

+0

@Alessandro:非常に興味深い、私はいつもそれが要件だと思った! C++ 0xでその変更が行われたのですか、それともいつもそうでしたか? (つまり、OPの 'A'はコンストラクタブルなのでコピーできないので、標準コンテナでは使用できません) –

答えて

2

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

代わりにポインタを格納します。ここでは、ダムのポインタを格納し、あなたは罰金だため、コンパイラはコピー・セマンティクスを実装させる:

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

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

ポインタを使用すると、ある程度の柔軟性を持っている:例えば、デフォルトの構築は、ゼロへのポインタを設定することができ、そしてその後の操作は、その反対をチェック妥当性(または単にassert)。また、ポインタをリセットすることもできますが、これは参照の場合には当てはまりません。

2

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

0

あなたは値でBを保存しておらず、生涯の問題を理解しています(コピーするかどうかにかかわらず適用されます)ので、デフォルトのコピーコンストラクタを使用しても問題ありません。

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

+0

ohk ....ポイントを指摘.... –

+0

btw ...私はすでにコンストラクタを明示したと思います.... それはもっと明示的であるべきですか?はいの場合はどのように? –

0

Bの代入演算子がプライベートの場合、コンパイラはAの代入演算子のデフォルトを生成できません。代入演算子を明示的に宣言する必要があります。あなたはSTLコンテナにオブジェクトAは問題を入れていないはずです、ということで行われるとhttp://msdn.microsoft.com/en-us/library/aa983787%28v=vs.71%29.aspx

:そうしないと、コンパイルエラーを得ました。

+0

ohk ...うーん...私は代理演算子をとにかくしたい...だから私は1つ私は推測する...ありがとう....... –

+0

私はリンクを見た...私はそれは同じことを確認していない...私はコードを試してみるだろうし、何が起こるか知って...もしデフォルトの代入演算子がない場合..私はそれを私が推測する実装する.... .. –

+0

でもBはコピーできません...どのように代入演算子を定義しますか? –

関連する問題