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

Posted

技术标签:

【中文标题】如何在 MFC 中创建“CArray<CArray<CString>>& results”?【英文标题】:How to create "CArray<CArray<CString>>& results" in MFC? 【发布时间】:2017-01-17 05:30:13 【问题描述】:

我无法根据代码“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”中声明的私有成员

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

【问题讨论】:

C2248 是编译器错误,而不是执行错误。上面sn-p中编译错误指向哪一行? 在当今的 C++ 时代,MFC 容器类是否仍然重要?你可以简单地使用std::vector&lt;std::vector&lt;CString&gt;&gt; @andlabs - 编译器错误是由于行“res.Add(strArray1);” CArray 基类的复制构造函数被有意标记为私有,所以你不能做你正在尝试的事情。如果您必须拥有数组数组,@PaulMcKenzie 建议的评论是前进的最佳方式。 【参考方案1】:

CArray::Add() 的签名是

INT_PTR Add(ARG_TYPE newElement);

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

This question 解释了为什么CObjects 不可复制构造。

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

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

【讨论】:

另一种选择是将二维数组映射到一维数组。 哦,我完全忘记了那个选项!谢谢。 仍然需要注意,将二维数组映射到一维数组仅适用于矩形矩阵(即所有行具有相同列数的数组)。如果你有一个锯齿状数组,你必须继续使用数组数组。

以上是关于如何在 MFC 中创建“CArray<CArray<CString>>& results”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++/MFC/GDI 中创建一个非常大的位图

如何在Visual Studio 2015中创建MFC窗体应用

如何在Visual Studio 2015中创建MFC窗体应用

如何在 Mfc c++ 中创建透明矩形?

如何在 MFC 中创建预渲染输入窗口?

如何在 Visual Studio 2017 中创建 Visual c++ MFC 控制台项目