off*_*ron 0 c++ mfc visual-c++
根据代码“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);
Run Code Online (Sandbox Code Playgroud)
执行后错误:错误 C2248:“CObject::operator =”:无法访问在类“CObject”中声明的私有成员
这应该在不覆盖 CArray 中的 copy 和 equals 方法的情况下完成,而是有什么方法可以让我不需要像某些可以利用的 CArray 方法那样间接地使用它们。
的签名CArray::Add()是
INT_PTR Add(ARG_TYPE newElement);
Run Code Online (Sandbox Code Playgroud)
您会注意到newElement参数是按值传递的。这意味着元素类型必须是可复制构造的,而CObjects 不是。这不是特别有据可查的。部分CMap文档声明映射的值类型必须是可复制构造的,因此我们可以假设 API 的其余部分是类似设计的。
这个问题解释了为什么CObjects 不可复制构造。
所以,你可以做什么?您有多种选择。
CArray<CArray<CString> *>— 将内部维度数组存储为指针而不是值;这也节省了内存CTypedPtrArray<CObjArray, CArray<CString> *>,这允许您改为使用CObArray,并且仍然是类型安全的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>其他)。在这种情况下,在您的代码片段中与. 事实上,这就是多维数组归结起来的原因,正如有关 C 中矩阵乘法的教科书示例所展示的那样。(感谢@IInspectable 让我想起了这个。)m * nmarr[i][j]arr[i * m + j]