如何在MFC中创建“CArray <carray <cstring>&gt;&amp; results”?

时间:2017-01-17 05:30:13

标签: c++ visual-c++ mfc

我无法根据代码“CArray&gt;&amp; 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和equals方法的情况下完成,而是有任何方式我不需要像CArray的某些方法那样间接地使用它们。

1 个答案:

答案 0 :(得分:4)

CArray::Add()的签名是

INT_PTR Add(ARG_TYPE newElement);

您会注意到newElement参数是按值传递的。这意味着元素类型必须是可复制构造的,CObject不是。这没有特别好记录; CMap文档的部分内容表明地图的值类型必须是可复制构造的,因此我们可以假设API的其余部分设计相似。

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

那你能做什么?你有几个选择。

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