繁体   English   中英

如何创建“ CArray” <CArray<CString> &gt;&结果”在MFC中?

[英]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 and 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::stringstd::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提醒我这一点。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM