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

标签 c++ visual-c++ mfc

我无法按照代码“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);

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

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

最佳答案

CArray::Add() 的签名是

INT_PTR Add(ARG_TYPE newElement);

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

This question解释为什么CObject s 不可复制构造。

那你能做什么?您有多种选择。

  • 切换到使用 CArray<CArray<CString> *> — 将内部维度数组存储为指针而不是值;这也节省了内存
  • 切换到使用 CTypedPtrArray<CObjArray, CArray<CString> *> ,它允许您使用 CObArray相反,并且仍然是类型安全的
  • 切换到使用标准 C++ 容器,即 std::vector<std::vector<CString> >正如@PaulMcKenzie 上面所建议的那样。 CString不是 CObject ,所以你可以直接使用它。或者,如果您只是使用 CString作为 C 字符串的包装器,您还可以切换到 std::stringstd::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 提醒我这一点。)

关于c++ - 如何在MFC中创建 "CArray<CArray<CString>>& results"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41689647/

相关文章:

python - 无法在 Windows 10 中构建 V8

c++ - 为什么 C++ 不必要的循环使程序更快?

c++ - 在数组 C++ 中使用删除关键字

c++ - 如何在 C++ 中优化我的查询?

c++ - "Cannot execute binary file"在 Ubuntu for Windows 平台上使用 Eclipse 运行已编译的 c++ 程序时

c++ - InvertableRSAFunction 无法将 Diffie-Hellman key 加密为常量字节*

c++ - "*ptrInt++"是做什么的?

c++ - 使用 CDC 的 MFC 打印仅适用于某些打印机

c++ - 为什么 “delete *this” 会编译?

windows - 使用浏览器窗口容器中的 ActiveX 控件,如何检测用户何时将选项卡从 ActiveX 控件中移开