如何在 MFC 中创建"CArray<CArray<CString>>& results"?
How to create "CArray<CArray<CString>>& results" in MFC?
我无法按照代码"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::string
或std::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提醒我这一次。)
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中