gpt4 book ai didi

c++ - MFC序列化

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:04 24 4
gpt4 key购买 nike

我必须序列化基类和派生类的 CList。我怎样才能做到这一点。

typedef CList<Student*, Student*> StVec;

class Student : public CObject
{
public:
DECLARE_SERIAL(Student);

Student();
Student(Student& s);
Student(CString _name, CString _last, int _age);
virtual ~Student(void);

virtual void cin();
virtual void cout();

virtual void Serialize(CArchive& ar);

static Student* FromInput();

inline const CString GetName(){return name;}
inline const CString GetLastName(){return last_name;}
inline const int GetAge(){return age;}

virtual inline Student& operator=( const Student &s )
{
name = s.name;
last_name = s.last_name;
age = s.age;
return *this;
}

protected:
CString name;
CString last_name;
int age;
};

class Warden : public Student
{
protected:
virtual void Serialize(CArchive& ar);
UINT salary;
};

class Group : public CObject
{
public:
DECLARE_SERIAL(Group);

enum FindType { First = 0, Last, All};
typedef bool (*StudentsFindCallback) (Student* student, void* condition);

Group(){ name = _T("Default Group"); }
Group(CString _name);
Group(Group& s);

~Group();

void CreateUser();
void ShowUsers();
//StVecOfIt FindUser(StudentsFindCallback f, void* condition, FindType ft);
inline Student* getStudent(POSITION pos) {return students->GetNext(pos); }
inline void DeleteUser(POSITION it){ students->RemoveAt(it); }
virtual void Serialize(CArchive& ar);
void Clean();

/*static bool FindbyName(Student* student, void* condition);
static bool FindbyLastName(Student* student, void* condition);
static bool FindbyAge(Student* student, void* condition);*/

virtual inline Group& operator=( const Group &s )
{
name = s.name;
students = s.students;
return *this;
}

protected:
CString name;
StVec* students;
};

void Student::Serialize(CArchive& ar)
{
CObject::Serialize( ar );

if (ar.IsStoring())
{
ar.SerializeClass(Student::GetRuntimeClass());
ar << name << last_name << age;
}
else
{
ar.SerializeClass(Student::GetRuntimeClass());
ar >> name >> last_name >> age;
}
}
void Group::Serialize(CArchive& ar)
{
ar.SerializeClass(RUNTIME_CLASS(Group));

if (ar.IsStoring())
{
ar << (int)students->GetCount();

POSITION pos = students->GetHeadPosition();
while(pos != NULL)
{
Student* student = students->GetNext(pos);

student->Serialize(ar);
}
}
else
{
Clean();
int count = 0;
ar >> count;

for(INT_PTR i = 0; i < count; ++i)
{
Student* st = new Student();
st->Serialize(ar);
students->AddTail(st);
}
}
}

我在 codeproject 找到了一篇文章但我根本无法理解。

当然我可以添加一个标志来指示类的类型。我也可以序列化到派生类,如果派生属性为空,则使用 static_cast 将其派生到基类。或者我正在考虑使用 CArchive::ReadObjectCArchive::ReadClass 来加载类,但是还有其他方法吗?

最佳答案

我的 MFC 生锈了,但我相信这应该可以工作(未经测试!)。

此外,您的 Serialize() 方法不应该为它自己的类调用 SerializeClass。由调用者决定调用它。例如,<< 和 >> 运算符用于识别存档中下一个对象的类。

void Student::Serialize( CArchive& ar ) 
{
CObject::Serialize( ar );

if (ar.IsStoring())
{ // No need for SerializeClass here.
ar << name << last_name << age;
}
else
{ // No need for SerializeClass here.
ar >> name >> last_name >> age;
}
}
void Group::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << (int)students->GetCount();

POSITION pos = students->GetHeadPosition();
while(pos != NULL)
{
Student* student = students->GetNext(pos);
ar << student; // << includes class info about the serialized object
}
}
else
{
Clean();
int count = 0;
ar >> count;

for(INT_PTR i = 0; i < count; ++i)
{
CObject *p;
ar >> p; // Deserialize whatever kind of object comes next
students->AddTail(p);
}
}
}

关于c++ - MFC序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12629476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com