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

off*_*ron 0 c++ mfc visual-c++

根据代码“CArray>& results”,我无法在 MFC 中创建二维数组。代码:

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);
Run Code Online (Sandbox Code Playgroud)

执行后错误:错误 C2248:“CObject::operator =”:无法访问在类“CObject”中声明的私有成员

这应该在不覆盖 CArray 中的 copy 和 equals 方法的情况下完成,而是有什么方法可以让我不需要像某些可以利用的 CArray 方法那样间接地使用它们。

and*_*abs 5

的签名CArray::Add()是

INT_PTR Add(ARG_TYPE newElement);
Run Code Online (Sandbox Code Playgroud)

您会注意到newElement参数是按值传递的。这意味着元素类型必须是可复制构造的,而CObjects 不是。这不是特别有据可查的。部分CMap文档声明映射的值类型必须是可复制构造的,因此我们可以假设 API 的其余部分是类似设计的。

这个问题解释了为什么CObjects 不可复制构造。

所以,你可以做什么?您有多种选择。

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