CArray<Class, Class&>のAddをするときに、対象ClassのメンバのCArrayがコピーするには?


おっぴー  2011-11-02 14:55:01  No: 72984  IP: [192.*.*.*]

環境: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には何も入っていません。


どのようにしたら解決しますでしょうか?
ご回答よろしくお願いいたします。

編集 削除
仲澤@失業者  2011-11-02 17:00:01  No: 72985  IP: [192.*.*.*]

この場合のAdd()では、追加されるクラスのコピーコンストラクタ
が実行されるので、それが正しく「全メンバをコピー」しなければ
なりません。コピーコンストラクタが明示的に定義されていない場合、
コンパイラはは単にメンバ間の代入を行うだけです。
ClassBにはコピーコンストラクタが明示的に定義されてませんよね。
つまり、
ClassB( const ClassB & ex){ // コピーコンストラクタ
 // m_iだけでなく、ClassCの配列もコピーする
}

のようなコードが必要だと思います。
当然ですが、その他のコピーされそうな、全てのメンバのクラスにも
「正しい」コピーコンストラクタが必要です。

編集 削除
仲澤@失業者  2011-11-02 17:26:43  No: 72986  IP: [192.*.*.*]

ごめん間違った。
本質的に必要なのは、代入オペレータのほうですね。orz.
ClassB & operator =( const ClassB &ex)
{
// m_iだけでなく、ClassCの配列もコピーする
  return *this;
}
みたいなやつですね。失礼しましたm(__)m。

編集 削除