一般来说,用c++创建对象都是用new、或者是临时变量生成的方法来完成的。而在mfc中我们发现,其实不是这样的。不知道大家有没有注意,无论是view类、doc类、frame类,它们的创建都是系统自动创建生成的,中间不需要开发者进行任何的参与。
这就奇怪了,既然不需要开发者的参与,那么这些class又是怎么创建的呢?原因其实还在于static函数。前面两个blog讨论到了static变量,那么创建对象的过程其实也可以包含在static函数中,大家想一下是不是可以通过这种方法来完成。如果还是觉得想不太出来如何实现的话,可以参考一下下面的代码,或许对大家有一些启发。
#include <iostream>
using namespace std;
class cobject;
struct runclass {
char name[64];
struct runclass* next;
cobject* (*func)();
};
#define get_class(basic) \
basic::get_run_class()
#define CREATE_RUNCLASS(basic) \
static runclass run_##basic; \
static runclass* get_run_class() {return &run_##basic;} \
static cobject* create_object() {return new basic();}
class cobject{
public:
CREATE_RUNCLASS(cobject)
public:
cobject() {
cout << "cobject::cobject()" << endl;
}
virtual ~cobject() {
cout << "cobject::~cobject()" << endl;
}
};
runclass cobject::run_cobject = {"cobject", NULL, &cobject::create_object};
#define IMPLEMENT_RUN_CLASS(basic, origin) \
runclass basic::run_##basic = {#basic, &origin::run_##origin, &basic::create_object}
class ctemplate : public cobject {
public:
ctemplate() {
cout << "ctemplate::ctemplate()" << endl;
}
~ctemplate() {
cout << "ctemplate::~ctemplate()" << endl;
}
CREATE_RUNCLASS(ctemplate)
};
IMPLEMENT_RUN_CLASS(ctemplate, 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) ? true :false;
}
int
main(int argc, char* argv[]){
runclass* p = get_class(ctemplate);
cobject* c = (*(p->func))();
delete c;
cout << isKindOf(get_class(ctemplate), get_class(cobject)) << endl;
return 0;
}