環境:VS2008 Windows7
ClassAには、以下のメンバがあるとします。
class ClassA
{
public:
CArray<ClassB, ClassB&> m_array1;
};
ClassBには、以下のメンバがあるとします。
class ClassB
{
public:
int m_i;
CArray<ClassC, ClassC&> m_array2;
};
このときに、ソースコードは以下のようになります。
void ClassA::func(){
ClassB classB;
classB.m_i = 10;
ClassC classC;
/*
省略
classCに適当なものをセットする
*/
classB.m_array2.Add(classC);
m_array1.Add(classB); //問題の部分
}
このとき、Addする前のclassBには、m_i、m_array2に適切な値が入っているのですが、
Addしたあとの、m_array1には、
m_iの値は入っているのですが、m_array2には何も入っていません。
どのようにしたら解決しますでしょうか?
ご回答よろしくお願いいたします。
この場合のAdd()では、追加されるクラスのコピーコンストラクタ
が実行されるので、それが正しく「全メンバをコピー」しなければ
なりません。コピーコンストラクタが明示的に定義されていない場合、
コンパイラはは単にメンバ間の代入を行うだけです。
ClassBにはコピーコンストラクタが明示的に定義されてませんよね。
つまり、
ClassB( const ClassB & ex){ // コピーコンストラクタ
// m_iだけでなく、ClassCの配列もコピーする
}
のようなコードが必要だと思います。
当然ですが、その他のコピーされそうな、全てのメンバのクラスにも
「正しい」コピーコンストラクタが必要です。
ごめん間違った。
本質的に必要なのは、代入オペレータのほうですね。orz.
ClassB & operator =( const ClassB &ex)
{
// m_iだけでなく、ClassCの配列もコピーする
return *this;
}
みたいなやつですね。失礼しましたm(__)m。
ツイート | ![]() |