我无法按照代码“ CArray>&results”在MFC中创建2D数组。
码:

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);


执行后错误:
错误C2248:“ CObject :: operator =”:无法访问在类“ CObject”中声明的私有成员

应该在不覆盖CArray中的copy and equals方法的情况下完成此操作,相反,有什么方法可以像使用CArray的某些方法那样间接地不需要那些方法。

最佳答案

CArray::Add()的签名是

INT_PTR Add(ARG_TYPE newElement);


您会注意到newElement参数是按值传递的。这意味着元素类型必须是可复制构造的,而CObject则不是。没有特别有据可查的文件; CMap文档的某些部分指出,映射的值类型必须是可复制构造的,因此我们可以假定其余API的设计都是类似的。

This question解释了为什么CObject不可复制构造。

所以,你可以做什么?您有几种选择。


切换为使用CArray<CArray<CString> *> —将内部维数组存储为指针而不是值;这也节省了内存
切换到使用CTypedPtrArray<CObjArray, CArray<CString> *>,它允许您改为使用CObArray,并且仍然是类型安全的
切换到使用标准C ++容器,即上述@PaulMcKenzie建议的std::vector<std::vector<CString> >CString不是CObject,因此您可以直接使用它。另外,如果仅将CString用作C字符串的包装器,则也可以切换到std::stringstd::wstring,但是只有在知道自己要做什么的情况下才这样做。
当然,如果您需要内部尺寸为CArray,也可以执行std::vector<CArray<CString> *>。与往常一样,该模式要求您使用指针-出于与上述相同的原因,您不能只说std::vector<CArray<CString> >std::vector需要复制可构造性)。
使用尺寸为CArray<CString>(其中std::vector<CString>是内部尺寸的大小)的一维数组(m * nm或其他)。在这种情况下,您的代码段中的arr[i][j]arr[i * m + j]相同。实际上,这就是多维数组的本质,正如有关C中矩阵乘法的教科书示例所示。 (感谢@IInspectable提醒我这一点。)

09-10 03:46