如何在 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<std::vector<CString>>
。
@andlabs - 编译器错误是由于行“res.Add(strArray1);”
CArray
基类的复制构造函数被有意标记为私有,所以你不能做你正在尝试的事情。如果您必须拥有数组数组,@PaulMcKenzie 建议的评论是前进的最佳方式。
【参考方案1】:
CArray::Add()
的签名是
INT_PTR Add(ARG_TYPE newElement);
您会注意到newElement
参数是按值传递的。这意味着元素类型必须是可复制构造的,CObject
s 不是。这不是特别有据可查的。 CMap
文档的部分内容声明地图的值类型必须是可复制构造的,因此我们可以假设 API 的其余部分设计类似。
This question 解释了为什么CObject
s 不可复制构造。
那你能做什么?您有多种选择。
切换到使用CArray<CArray<CString> *>
——将内部维度数组存储为指针而不是值;这也节省了内存
切换到使用CTypedPtrArray<CObjArray, CArray<CString> *>
,这样您就可以改用CObArray
,并且仍然是类型安全的
切换到使用标准 C++ 容器,即 @PaulMcKenzie 上面建议的 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
的一维数组(CArray<CString>
或std::vector<CString>
或其他)(其中m
是内部维度的大小)。在这种情况下,您的代码 sn-p 中的arr[i][j]
与arr[i * m + j]
相同。事实上,这就是多维数组的归结,正如 C 中矩阵乘法的教科书示例所展示的那样。 (感谢@IInspectable 提醒我这个。)
【讨论】:
另一种选择是将二维数组映射到一维数组。 哦,我完全忘记了那个选项!谢谢。 仍然需要注意,将二维数组映射到一维数组仅适用于矩形矩阵(即所有行具有相同列数的数组)。如果你有一个锯齿状数组,你必须继续使用数组数组。以上是关于如何在 MFC 中创建“CArray<CArray<CString>>& results”?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Visual Studio 2015中创建MFC窗体应用