2017-01-17 52 views
0

コード "CArray> &結果"に従って、MFCで2D配列を作成できません。 コード: エラーC2248:実行後のMFCで "CArray <CArray <CString>>&結果"を作成する方法?

CArray<CArray<CString>> res; 

    CArray<CString>strArray1; 

    strArray1.Add(L"Ali"); 
    strArray1.Add(L"Ahmed"); 
    strArray1.Add(L"Mark"); 

    CArray<CString>strArray2; 

    strArray2.Add(L"1"); 
    strArray2.Add(L"2"); 
    strArray2.Add(L"3"); 

res.Add(strArray1); 
res.Add(strArray2); 

エラー「CObjectの::演算子=」:クラスで宣言されたプライベートメンバにアクセスすることはできません「CObjectの」

これはコピーを上書きせずに行われ、equalsメソッドをする必要がありますCArrayでは、代わりに、私がCArrayを利用できるいくつかの方法のように間接的にそれらを必要としない方法があります。

+0

C2248はコンパイルエラーです。実行エラーではありません。コンパイラのエラーが上記のスニペットのどの行に指していますか? – andlabs

+0

MFCコンテナクラスは、C++のこの日と年齢にはまだ関連していますか?単純に 'std :: vector >'を使うことができます。 – PaulMcKenzie

+0

@andlabs - コンパイルエラーは "res.Add(strArray1);"という行が原因です。 – offeron

答えて

4

CArray::Add()のための署名はあなたがnewElement引数は値渡しされることに気づくでしょう

INT_PTR Add(ARG_TYPE newElement); 

です。つまり、要素タイプはコピー構成可能でなければならず、CObjectはそうではありません。これはあまり詳しく書かれていません。ドキュメントの部分は、マップの値の型がコピーコンストラクタブルでなければならないと述べているので、残りのAPIは同様に設計されていると見なすことができます。

This questionは、なぜCObjectがコピーコンストラクタブルでないのかを説明しています。

あなたは何をすることができますか?いくつかの選択肢があります。

  • CArray<CArray<CString> *>に切り替える - 値の代わりにポインタとして内部次元の配列を格納します。これはまた、あなたが代わりにCObArrayを使用し、まだ@PaulMcKenzieは、上記の提案として、標準C++のコンテナを使用するタイプセーフ
  • スイッチ、すなわちstd::vector<std::vector<CString> >にすることができますCTypedPtrArray<CObjArray, CArray<CString> *>を、使用するメモリ
  • スイッチが保存されます。 CStringCObjectではないため、直接使用することができます。また、CStringをC文字列のラッパーとして使用している場合は、std::stringまたはstd::wstringに切り替えることもできますが、実行していることが分かっている場合にのみ行うようにしてください。
  • もちろん、内側の寸法がCArrayになるようにする必要がある場合は、std::vector<CArray<CString> *>を使用することもできます。いつものように、このパターンではポインタを使用する必要があります。std::vector<CArray<CString> >と同じ理由で(std::vectorにはコピーコンストラクタビリティが必要です)、あなたは言うことができません。
  • サイズm * nmは内寸のサイズ)の1次元配列(CArray<CString>またはstd::vector<CString>など)を使用します。その場合、コードスニペットのarr[i][j]arr[i * m + j]と同じです。実際には、これは多次元配列が沸騰していくもので、Cでの行列乗算に関する教科書の例が示されます。 (これは私に思い出させてくれてありがとうございます)
+1

もう1つの選択肢は、2次元配列を1次元配列にマッピングすることです。 – IInspectable

+0

私は完全にそのオプションを忘れてしまった!ありがとう。 – andlabs

+1

なお、2次元配列を1次元配列にマッピングすることは、矩形行列(すなわち、すべての行が同じ数の列を有する配列)に対してのみ機能することに留意することが重要である。ギザギザの配列がある場合、配列の配列を使い続ける必要があります。 – IInspectable

関連する問題