MFC文件保存和读取的有关问题
MFC文件保存和读取的问题。
我在界面画完图形后,我想把这个保存。其实我自己定义了一个CGraphicElement类,这个类的构造函数函数为:
CGraphicElement::CGraphicElement(sGraphicFormat geFmt,sGraphicHeader geHdr,sPointPosition * psPstn)
其实sGraphicFormat,sGraphicHeader和sPointPosition都是自己写的结构体。
还有一个CTypedPtrArray<CObArray,CGraphicElement*> sogOA用来保存画好的数据。
然后我在CGraphicElement类中写了一个Serialize函数:
void CGraphicElement::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
ar<<geFormat<<geHeader<<sPntPosition;
}
else
{
ar>>geFormat>>geHeader>>sPntPosition;
}
}
调试出线了两个错误,
error C2678: 二进制“<<”: 没有找到接受“CArchive”类型的左操作数的运算符(或没有可接受的转换)
error C2679: 二进制“>>”: 没有找到接受“sGraphicFormat”类型的右操作数的运算符(或没有可接受的转换)
这个问题要怎么解决啊?
------解决方案--------------------
CArchive并不支持结构体的直接序列化, 要在你的几个结构体重写序列化操作符
void operator << (CArchive& ar)
{
……//保存代码
}
void operator >> (CArchive& ar)
{
……//读取代码
}
------解决方案--------------------
举个例子
我在界面画完图形后,我想把这个保存。其实我自己定义了一个CGraphicElement类,这个类的构造函数函数为:
CGraphicElement::CGraphicElement(sGraphicFormat geFmt,sGraphicHeader geHdr,sPointPosition * psPstn)
其实sGraphicFormat,sGraphicHeader和sPointPosition都是自己写的结构体。
还有一个CTypedPtrArray<CObArray,CGraphicElement*> sogOA用来保存画好的数据。
然后我在CGraphicElement类中写了一个Serialize函数:
void CGraphicElement::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
ar<<geFormat<<geHeader<<sPntPosition;
}
else
{
ar>>geFormat>>geHeader>>sPntPosition;
}
}
调试出线了两个错误,
error C2678: 二进制“<<”: 没有找到接受“CArchive”类型的左操作数的运算符(或没有可接受的转换)
error C2679: 二进制“>>”: 没有找到接受“sGraphicFormat”类型的右操作数的运算符(或没有可接受的转换)
这个问题要怎么解决啊?
------解决方案--------------------
CArchive并不支持结构体的直接序列化, 要在你的几个结构体重写序列化操作符
void operator << (CArchive& ar)
{
……//保存代码
}
void operator >> (CArchive& ar)
{
……//读取代码
}
------解决方案--------------------
举个例子
- C/C++ code
struct _testStruct { int iVal; long lVal; }testStruct; CArchive& AFXAPI operator<<(CArchive& ar, _testStruct &_tstruct) { return ar << _tstruct.iVal << _tstruct.lVal; } CArchive& AFXAPI operator>>(CArchive& ar, _testStruct &_tstruct) { return ar >> _tstruct.iVal >> _tstruct.lVal; } // CSDI_1Doc 序列化 void CSDI_1Doc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: 在此添加存储代码 int iVal =1; ar << iVal << testStruct; } else { // TODO: 在此添加加载代码 int iVal; ar >> iVal >> testStruct; } }
------解决方案--------------------
楼上正解,自己的类需要重载操作符,感觉楼主对操作符也不熟悉,要么索性别用Operator了,自己写数据加载和拷贝函数