MFC结构数组

Posted

技术标签:

【中文标题】MFC结构数组【英文标题】:MFC structure array 【发布时间】:2014-05-30 08:45:56 【问题描述】:

我想用 C++ 创建一个结构数组。我不知道大小,所以我想让它动态化。我尝试过使用 CList,但失败了。所以我尝试使用向量,但我有同样的错误。

我的标题中有以下结构:

typedef CArray<CArray<double, double>,double> ObjectArray;
struct MyStruct 
  CString type;
  CString name;
  ObjectArray value;
;
std::vector<MyStruct> ST;

在我的 cpp 文件中,我有以下代码来填充我的数组。 STR 是我预先填充的结构。

ST.push_back(STR);

构建时出现以下错误:

c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxtempl.h(262): 错误 C2248: 'CObject::CObject' : 无法访问在类 'CObject

我想我做错了什么,但我不明白我错过了什么。

【问题讨论】:

STR 的类型是什么? MyStruct(应该)? 更好地展示你如何填充 STR... copy-constructor 可能是private,但是看你的代码也说不出来。 【参考方案1】:

为什么不将 MFC 容器与 STL 容器混合使用,为什么不始终使用std::vector

#include <vector>
typedef std::vector<std::vector<double> > ObjectArray;
struct MyStruct 
    CString type;
    CString name;
    ObjectArray value;
;

std::vector<MyStruct> ST;

CString 没问题(CString 有它的用途,也可以复制)。然而,在当今时代,使用 MFC 容器代替 STL 容器的情况很少,如果有必要的话。我读到即使微软也不再在他们的基于 C++ 的程序中使用它们,现在只使用 STL 容器。

【讨论】:

非常感谢。正如大家所说,混合 MFC/STL 是错误的根源。通过用 STL 容器替换我的 ObjectArray,我不再有错误。以后我会尽量坚持STL容器。【参考方案2】:

如果您从CObject 派生类,则必须提供自定义复制构造函数,请参见此处:

http://msdn.microsoft.com/en-us/library/st9cdfkz.aspx

“标准 C++ 的默认类复制构造函数执行逐个成员的复制。如果您的类的复制构造函数需要但不可用,则私有 CObject 复制构造函数的存在保证了编译器错误消息。因此,您必须提供如果您的类需要此功能,则为复制构造函数。”

我猜结构内部的CArray 会产生问题,因为它是从CObject 派生的,并且没有定义自定义复制构造函数,请参见此处:

http://msdn.microsoft.com/en-us/library/4h2f09ct.aspx

要么不使用它,要么从CArray 派生一些CDerivedArray 并在那里定义一个自定义复制构造函数。

为什么不使用std::vectorstd::map 或其他STL 类而不是CArray

【讨论】:

以上是关于MFC结构数组的主要内容,如果未能解决你的问题,请参考以下文章

结构数组 - 初始化错误

mfc CFile 读取内容到char数组的问题?

mfc 类对象数组

mfc学生成绩录入与查询

MFC中如何把CString与char数组互换

如何在 MFC 中为 CSocket 创建一个套接字数组?