串行化类对象做成员

来源:百度知道 编辑:UC知道 时间:2024/05/04 20:04:25
我写了个串行化的类 名叫sippo(我验证过这个类应该写的没有问题),并在一在对话框类CmyDlg中加入CList<sippo,sippo&> lss;
可是编译时出错:CObject::operator =' : cannot access private member declared in class 'CObject',请问是怎么回事?
CList<sippo,sippo&>用的不对么?还是什么?
初学,不太熟悉,请高手帮下谢谢。
谢谢silvergingko,就是没重载赋值运算符。但是我又遇到问题了:
我定义了一个CList<sippo,sippo&>* siarchive;//在构造函数中new过了
在对单击按钮消息处理函数中:
siarchive->AddTail(s1);
CFile file(_T("ttt.dat"),CFile::modeReadWrite);
CArchive art(&file,CArchive::store);
art<<siarchive;//运行这儿时出问题了
------------------------------
siarchive确实插进了s1,就是“art<<siarchive;”出了问题,ttt.dat没有被写入任何东西
出错信息:
试图执行系统不支持的操作
Cannot call WriteClass/WriteObject for CObject
这有是怎么回事啊?

CList用得不对。如果你自定义了一个类,你必须要做两件事:
1)提供一个默认构造函数:sippo() {...}
2)提供一个赋值运算符函数;sippo& operator = (sippo&) {...; return (*this); }
理由是:
CList为了将元素保存时(AddTail),它会在内部定义一个类变量,然后用你从AddTail传进去的类实例通过=号赋值给这个内部定义的类变量,最后CList将类变量保存起来。至于你传进去的类实例,CList是不会动的,这是合理的!

另外:注意两点:
1对于CList的AddTail时,请不要用AddTail(sippo(x,x,x))的形式,应该用标准形式:sippo mySippo(x,x,x); xxx.AddTail(mySippo);前一种形式会编译器会给出警告,原因请参考C++语法知识,不细说了。
2因为要用到串行化,因此你应该知道你的类必须是CObject的派生类,可能我多废话了,还是提醒一下!