代码如下
Book.h#include <afxwin.h>class CBook : public CObject
{
DECLARE_SERIAL(CBook) public:
CString m_strName;
CString m_strAuthor;
CString m_strPress; public:
CBook()
{
// 要使CBook对象实现序列化,必须定义默认构造函数
} CBook(CString strName, CString strAuthor, CString strPress)
{
m_strName = strName; // 书名
m_strAuthor = strAuthor; // 作者
m_strPress = strPress; // 出版社
} void Serialize(CArchive &); // 重载基类的Serialize函数
};Book.cpp#include "Book.h"IMPLEMENT_SERIAL(CBook, CObject, 1)void CBook::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar << m_strName << m_strAuthor << m_strPress;
}
else
{
ar >> m_strName >> m_strAuthor >> m_strPress;
}
}
主程序如下
CBook book1("Programming Windows", "Charles Petzold", "Microsoft Press");
CBook book2("Programming Windows with MFC", "Jeff Prosise", "Microsoft Press");
int nCount = 2;// 序列化,没有问题,可用ultraedit查看没错
CFile fileStore(_T("mybooks.dat"), CFile::modeWrite | CFile::modeCreate);
CArchive arStore(&fileStore, CArchive::store);
CBook* pBooksStore[2] = { &book1, &book2 };
arStore << nCount;
for (int i=0; i<nCount; ++i)
{
arStore << pBooksStore[i];
}// 反序列化,,出现问题
CFile fileLoad(_T("mybooks.dat"), CFile::modeRead);
CArchive arLoad(&fileLoad, CArchive::load);
arLoad >> nCount;
CBook* pBooksLoad = new CBook[nCount];
for (int i=0; i<nCount; ++i)
{
arLoad >> pBooksLoad[i];
}提示错误如下 error C2679: 二进制“>>”: 没有找到接受“CBook”类型的右操作数的运算符(或没有可接受的转换)
d:\vs2005\vc\atlmfc\include\afx.h(1431): 可能是“CArchive &operator >>(CArchive &,ATL::CTimeSpan &)”
d:\vs2005\vc\atlmfc\include\afx.h(1438): 或“CArchive &operator >>(CArchive &,ATL::CTime &)”
d:\vs2005\vc\atlmfc\include\afx.h(1644): 或“CArchive &operator >>(CArchive &,CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1645): 或“CArchive &operator >>(CArchive &,const CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afxcoll.h(70): 或“CArchive &operator >>(CArchive &,CByteArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(145): 或“CArchive &operator >>(CArchive &,CWordArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(220): 或“CArchive &operator >>(CArchive &,CDWordArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(441): 或“CArchive &operator >>(CArchive &,CObArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(516): 或“CArchive &operator >>(CArchive &,CStringArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(700): 或“CArchive &operator >>(CArchive &,CObList *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(801): 或“CArchive &operator >>(CArchive &,CStringList *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1160): 或“CArchive &operator >>(CArchive &,CMapWordToOb *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1327): 或“CArchive &operator >>(CArchive &,CMapStringToOb *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1411): 或“CArchive &operator >>(CArchive &,CMapStringToString *&)”
d:\vs2005\vc\atlmfc\include\afxwin.h(192): 或“CArchive &operator >>(CArchive &,SIZE &)”
d:\vs2005\vc\atlmfc\include\afxwin.h(193): 或“CArchive &operator >>(CArchive &,POINT &)”
d:\vs2005\vc\atlmfc\include\afxwin.h(194): 或“CArchive &operator >>(CArchive &,RECT &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(947): 或“CArchive &operator >>(CArchive &,COleVariant &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(951): 或“CArchive &operator >>(CArchive &,ATL::CComBSTR &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1026): 或“CArchive &operator >>(CArchive &,COleCurrency &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1033): 或“CArchive &operator >>(CArchive &,ATL::COleDateTime &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1040): 或“CArchive &operator >>(CArchive &,ATL::COleDateTimeSpan &)”
e:\vs实验室\cs\实验对话框\实验对话框\book.h(5): 或“CArchive &operator >>(CArchive &,CBook *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1680): 或“CArchive &CArchive::operator >>(BYTE &)”
d:\vs2005\vc\atlmfc\include\afx.h(1681): 或“CArchive &CArchive::operator >>(WORD &)”
d:\vs2005\vc\atlmfc\include\afx.h(1682): 或“CArchive &CArchive::operator >>(DWORD &)”
d:\vs2005\vc\atlmfc\include\afx.h(1683): 或“CArchive &CArchive::operator >>(LONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1684): 或“CArchive &CArchive::operator >>(float &)”
d:\vs2005\vc\atlmfc\include\afx.h(1685): 或“CArchive &CArchive::operator >>(double &)”
d:\vs2005\vc\atlmfc\include\afx.h(1686): 或“CArchive &CArchive::operator >>(LONGLONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1687): 或“CArchive &CArchive::operator >>(ULONGLONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1689): 或“CArchive &CArchive::operator >>(int &)”
d:\vs2005\vc\atlmfc\include\afx.h(1690): 或“CArchive &CArchive::operator >>(short &)”
d:\vs2005\vc\atlmfc\include\afx.h(1691): 或“CArchive &CArchive::operator >>(char &)”
d:\vs2005\vc\atlmfc\include\afx.h(1693): 或“CArchive &CArchive::operator >>(wchar_t &)”
d:\vs2005\vc\atlmfc\include\afx.h(1695): 或“CArchive &CArchive::operator >>(unsigned int &)”
d:\vs2005\vc\atlmfc\include\afx.h(1696): 或“CArchive &CArchive::operator >>(bool &)”
d:\vs2005\vc\atlmfc\include\afx.h(1644): 或“CArchive &operator >>(CArchive &,CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1645): 或“CArchive &operator >>(CArchive &,const CObject *&)”[使用参数相关的查找找到]
e:\vs实验室\cs\实验对话框\实验对话框\book.h(5): 或“CArchive &operator >>(CArchive &,CBook *&)”[使用参数相关的查找找到]
试图匹配参数列表“(CArchive, CBook)”时
Book.h#include <afxwin.h>class CBook : public CObject
{
DECLARE_SERIAL(CBook) public:
CString m_strName;
CString m_strAuthor;
CString m_strPress; public:
CBook()
{
// 要使CBook对象实现序列化,必须定义默认构造函数
} CBook(CString strName, CString strAuthor, CString strPress)
{
m_strName = strName; // 书名
m_strAuthor = strAuthor; // 作者
m_strPress = strPress; // 出版社
} void Serialize(CArchive &); // 重载基类的Serialize函数
};Book.cpp#include "Book.h"IMPLEMENT_SERIAL(CBook, CObject, 1)void CBook::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
ar << m_strName << m_strAuthor << m_strPress;
}
else
{
ar >> m_strName >> m_strAuthor >> m_strPress;
}
}
主程序如下
CBook book1("Programming Windows", "Charles Petzold", "Microsoft Press");
CBook book2("Programming Windows with MFC", "Jeff Prosise", "Microsoft Press");
int nCount = 2;// 序列化,没有问题,可用ultraedit查看没错
CFile fileStore(_T("mybooks.dat"), CFile::modeWrite | CFile::modeCreate);
CArchive arStore(&fileStore, CArchive::store);
CBook* pBooksStore[2] = { &book1, &book2 };
arStore << nCount;
for (int i=0; i<nCount; ++i)
{
arStore << pBooksStore[i];
}// 反序列化,,出现问题
CFile fileLoad(_T("mybooks.dat"), CFile::modeRead);
CArchive arLoad(&fileLoad, CArchive::load);
arLoad >> nCount;
CBook* pBooksLoad = new CBook[nCount];
for (int i=0; i<nCount; ++i)
{
arLoad >> pBooksLoad[i];
}提示错误如下 error C2679: 二进制“>>”: 没有找到接受“CBook”类型的右操作数的运算符(或没有可接受的转换)
d:\vs2005\vc\atlmfc\include\afx.h(1431): 可能是“CArchive &operator >>(CArchive &,ATL::CTimeSpan &)”
d:\vs2005\vc\atlmfc\include\afx.h(1438): 或“CArchive &operator >>(CArchive &,ATL::CTime &)”
d:\vs2005\vc\atlmfc\include\afx.h(1644): 或“CArchive &operator >>(CArchive &,CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1645): 或“CArchive &operator >>(CArchive &,const CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afxcoll.h(70): 或“CArchive &operator >>(CArchive &,CByteArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(145): 或“CArchive &operator >>(CArchive &,CWordArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(220): 或“CArchive &operator >>(CArchive &,CDWordArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(441): 或“CArchive &operator >>(CArchive &,CObArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(516): 或“CArchive &operator >>(CArchive &,CStringArray *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(700): 或“CArchive &operator >>(CArchive &,CObList *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(801): 或“CArchive &operator >>(CArchive &,CStringList *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1160): 或“CArchive &operator >>(CArchive &,CMapWordToOb *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1327): 或“CArchive &operator >>(CArchive &,CMapStringToOb *&)”
d:\vs2005\vc\atlmfc\include\afxcoll.h(1411): 或“CArchive &operator >>(CArchive &,CMapStringToString *&)”
d:\vs2005\vc\atlmfc\include\afxwin.h(192): 或“CArchive &operator >>(CArchive &,SIZE &)”
d:\vs2005\vc\atlmfc\include\afxwin.h(193): 或“CArchive &operator >>(CArchive &,POINT &)”
d:\vs2005\vc\atlmfc\include\afxwin.h(194): 或“CArchive &operator >>(CArchive &,RECT &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(947): 或“CArchive &operator >>(CArchive &,COleVariant &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(951): 或“CArchive &operator >>(CArchive &,ATL::CComBSTR &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1026): 或“CArchive &operator >>(CArchive &,COleCurrency &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1033): 或“CArchive &operator >>(CArchive &,ATL::COleDateTime &)”
d:\vs2005\vc\atlmfc\include\afxdisp.h(1040): 或“CArchive &operator >>(CArchive &,ATL::COleDateTimeSpan &)”
e:\vs实验室\cs\实验对话框\实验对话框\book.h(5): 或“CArchive &operator >>(CArchive &,CBook *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1680): 或“CArchive &CArchive::operator >>(BYTE &)”
d:\vs2005\vc\atlmfc\include\afx.h(1681): 或“CArchive &CArchive::operator >>(WORD &)”
d:\vs2005\vc\atlmfc\include\afx.h(1682): 或“CArchive &CArchive::operator >>(DWORD &)”
d:\vs2005\vc\atlmfc\include\afx.h(1683): 或“CArchive &CArchive::operator >>(LONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1684): 或“CArchive &CArchive::operator >>(float &)”
d:\vs2005\vc\atlmfc\include\afx.h(1685): 或“CArchive &CArchive::operator >>(double &)”
d:\vs2005\vc\atlmfc\include\afx.h(1686): 或“CArchive &CArchive::operator >>(LONGLONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1687): 或“CArchive &CArchive::operator >>(ULONGLONG &)”
d:\vs2005\vc\atlmfc\include\afx.h(1689): 或“CArchive &CArchive::operator >>(int &)”
d:\vs2005\vc\atlmfc\include\afx.h(1690): 或“CArchive &CArchive::operator >>(short &)”
d:\vs2005\vc\atlmfc\include\afx.h(1691): 或“CArchive &CArchive::operator >>(char &)”
d:\vs2005\vc\atlmfc\include\afx.h(1693): 或“CArchive &CArchive::operator >>(wchar_t &)”
d:\vs2005\vc\atlmfc\include\afx.h(1695): 或“CArchive &CArchive::operator >>(unsigned int &)”
d:\vs2005\vc\atlmfc\include\afx.h(1696): 或“CArchive &CArchive::operator >>(bool &)”
d:\vs2005\vc\atlmfc\include\afx.h(1644): 或“CArchive &operator >>(CArchive &,CObject *&)”[使用参数相关的查找找到]
d:\vs2005\vc\atlmfc\include\afx.h(1645): 或“CArchive &operator >>(CArchive &,const CObject *&)”[使用参数相关的查找找到]
e:\vs实验室\cs\实验对话框\实验对话框\book.h(5): 或“CArchive &operator >>(CArchive &,CBook *&)”[使用参数相关的查找找到]
试图匹配参数列表“(CArchive, CBook)”时
{
public:
C(); // no constructor with an int argument
} c;
class D
{
public:
D( int );
D();
} d;
void main()
{
c = 10; // error
d = 10; // OK
}上面这样可以出现你那个问题,你自己再看一下
也就是你的
public:
CBook()
{
// 要使CBook对象实现序列化,必须定义默认构造函数
}
要修改一下
加上CBook()里放上CString strName, CString strAuthor, CString strPress
我已重载了CBook(CString strName, CString strAuthor, CString strPress)
{
m_strName = strName; // 书名
m_strAuthor = strAuthor; // 作者
m_strPress = strPress; // 出版社
}
期待解决