2016-11-05 5 views
0

私はクラスを持っており、メンバ変数の1つは別の複合クラスであるとします。私は、この複雑なクラスのコピーを作成しないようにしたい、私はちょうど私のクラスでそれを使用したい。 MyClassを整理する最良の方法は何ですか?クラスコンストラクタで複雑なデータをコピーしないようにする

class MyClass 
{ 
public: 
    MyClass(const ComplexClass& complex_class) 
    : m_class(complex_class) {} 

private: 
    const ComplexClass& m_class; // What is the best practice here? 
}; 

が、私はこれを行うことができます:私はこのような何かを持っている瞬間

?またはm_classポインタを必要がありますか?あなたはこの状況で何をしますか?

+0

私は奇妙な驚きを避けるために、明示的なMyClass(const ComplexClass * p):m_class(* p){} 'としてコンストラクタを記述します。 –

+0

@Kerrek SBどのような驚きがありますか? –

+0

渡された参照がスコープ内に残っていれば、確かにこれを行うことができ、クラスがもはやそれを必要としなくなるまで、参照されたオブジェクトを破壊するものはありません。しかし、参照が有効であることを保証する契約がない場合は、オブジェクトをコピーする必要があります。 –

答えて

0

渡された参照がオブジェクトの存続期間中に有効であることが保証できる場合は、このソリューションで十分です。

スマートポインタを使用することをおすすめします。共有されたデータの存続期間を延長するshared_ptr

(自分のクラスだけでなく、complex_classオブジェクトの宣言を再編成する必要がないだけで、あなたに注意してください)

0

初期化リストは初期化のみを許可しますので、構文:m_class(complex_class)は動作しません。初期化リストは、コンストラクターを呼び出すが、コンストラクターはコピーしません。だから、提案されたコードがコンパイルされるかどうかはわかりません。

m_classのコンストラクタがとる入力を取ることで、メンバ変数を初期化することができます。 constの使用法は、オブジェクトのライフサイクル中に変更されていないメンバ変数の値を助けますが、オブジェクトのコピーは常に作成でき、高価になる可能性があります。高価なコピーを避けることを目的としている場合は、コピーコンストラクタと代入演算子をプライベートにする必要があります。

関連する問題