剑客
关注科技互联网

[原]mfc大观之四(串行保存)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在mfc当中,保存其实是一件很简单的事情。你要做的很简单,第一步就是编写一个serial的虚函数,另外一步就是CArchive调用解决,整个过程非常简单和流畅。当然,为了判断class之间是否存在集成关系,它和之前的类一样也使用了runclass的方法,剩下的就是一些算术符号重载的trick了。大家有兴趣参考一下下面的代码,就明白其中的逻辑了。

#include <iostream>
using namespace std;

struct runclass {
	char name[64];
	struct runclass* next;

};

class cwrite {
public:
	cwrite() {
		cout << "cwrite::cwrite()" << endl;
	}
	~cwrite() {
		cout << "cwrite::~cwrite()" << endl;
	}
};


#define CREATE_SERIAL(basic) /
	static runclass run_##basic; /
	static runclass* get_run_class() {return &run_##basic;} /
	friend cwrite& operator <<(cwrite& c, basic& b) {b.serial(c); return c;}

class cobject {

public:
	cobject() {
		cout << "cobject::cobject()" << endl;
	}

	virtual ~cobject() {
		cout << "cobject::~cobject()" << endl;
	}

	virtual void serial(cwrite& c) {
		cout << "cobject::serial()" << endl;
	}

public:
	CREATE_SERIAL(cobject)
};

runclass cobject::run_cobject = {"cobject", NULL};

#define IMPLEMENT_SERIAL(basic, origin) /
	runclass basic::run_##basic = {#basic, &origin::run_##origin}

class cwnd : public cobject {

public:
	cwnd(){
		cout << "cwnd::cwnd()" << endl;
	}

	~cwnd() {
		cout << "cwnd::~cwnd()" << endl;
	}

	void serial(cwrite& c) {
		cout << "cwnd::serial()" << endl;
	}

public:
	CREATE_SERIAL(cwnd)
};

IMPLEMENT_SERIAL(cwnd, cobject);

bool
isKindOf(runclass* basic, runclass* origin){
	if(NULL == basic || NULL == origin)
		return false;

	while(basic->next)
		basic = basic->next;

	return 0 == strcmp(basic->name, origin->name) ? 1:0;
}

int
main(int argc, char* argv[]){

	cwrite c;
	cobject obj;
	cwnd wnd;
	c << obj;
	c << wnd;
	return 0;
}
分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址