如何在 MFC 中创建"CArray<CArray<CString>>& results"?

How to create "CArray<CArray<CString>>& results" in MFC?

本文关键字:gt lt CArray results CString MFC 创建      更新时间:2023-10-16

我无法按照代码"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的一些方法。

CArray::Add()的签名是

INT_PTR Add(ARG_TYPE newElement);

您会注意到newElement参数是通过值传递的。这意味着元素类型必须是可复制构造的,而CObject则不是。这并没有得到特别充分的记录;CMap文档的某些部分规定映射的值类型必须是可复制的,因此我们可以假设API的其余部分也是类似设计的。

这个问题解释了为什么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需要复制可构造性)
  • 使用大小为m * n(其中m是内部维度的大小)的一维数组(CArray<CString>std::vector<CString>或其他任何数组)。在这种情况下,代码片段中的arr[i][j]arr[i * m + j]相同。事实上,这就是多维数组的本质,正如C中矩阵乘法的教科书示例所示。(感谢@IInspectable提醒我这一次。)