我无法按照代码“ 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::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提醒我这一点。)