CArrayで配列の配列(ネスト)を実現したいことがよくある。
シンプルにこんなことやると、ビルドエラーになる。
typedef struct { // 構造体 CStringArray m_ary; }S_TEST; CArray<S_TEST,S_TEST> ary; S_TEST test1; test1.m_ary.Add(_T("a")); test1.m_ary.Add(_T("b")); ary2.Add(test1); S_TEST test2; test2.m_ary.Add(_T("c")); test2.m_ary.Add(_T("d")); ary2.Add(test2);
一方、こんなふうにするとうまくいく。
CArray<S_TEST*,S_TEST*> ary; S_TEST* pTest1 = new S_TEST; pTest1->m_ary.Add(_T("a")); pTest1->m_ary.Add(_T("b")); ary.Add(pTest1); S_TEST* pTest2 = new S_TEST; pTest2->m_ary.Add(_T("c")); pTest2->m_ary.Add(_T("d")); ary.Add(pTest2);
構造体定義をnewにしているだけのことだ。
以下のように、値を参照しても問題なかった。
CString msg; for( int i=0; i<ary.GetSize(); i++ ) { S_TEST* pTest = ary.GetAt(i); for( int j=0; j<pTest->m_ary.GetSize(); j++ ) msg += pTest->m_ary.GetAt(j); delete pTest; } AfxMessageBox( msg ); // abcdと出る