我无法根据代码“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和equals方法的情况下完成,而是有任何方式我不需要像CArray的某些方法那样间接地使用它们。
答案 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
,而且仍然是类型安全的std::vector<std::vector<CString> >
,如上面建议的@PaulMcKenzie。 CString
不是CObject
,因此您可以直接使用它。或者,如果您只是使用CString
作为C字符串的包装,您也可以切换到std::string
或std::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提醒我这个。)