[英]How to create “CArray<CArray<CString>>& results” in MFC?
根据代码“ 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的设计都是类似的。
这个问题解释了为什么CObject
不可复制构造。
所以,你可以做什么? 您有几种选择。
CArray<CArray<CString> *>
-将内部维数组存储为指针而不是值; 这也节省了内存 CTypedPtrArray<CObjArray, CArray<CString> *>
,这使您可以改用CObArray
,并且仍然是类型安全的 std::vector<std::vector<CString> >
。 CString
不是CObject
,因此您可以直接使用它。 另外,如果只是将CString
用作C字符串的包装器,则还可以切换到std::string
或std::wstring
,但是只有在知道自己在做什么的情况下,才执行此操作。 CArray
,则还可以执行std::vector<CArray<CString> *>
。 与往常一样,该模式要求您使用指针-出于与上述相同的原因,您不能只说std::vector<CArray<CString> >
( std::vector
需要复制可构造性)。 m * n
(其中m
为内部维度的大小)的一维数组( CArray<CString>
或std::vector<CString>
或其他)。 在这种情况下,您的代码段中的arr[i][j]
与arr[i * m + j]
。 实际上,这就是多维数组的基础,正如有关C中矩阵乘法的教科书示例所示。 (感谢@IInspectable提醒我这一点。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.