我无法按照代码“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::string
或std::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/