0
点赞
收藏
分享

微信扫一扫

mfc大观之三(创建对象)


   一般来说,用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;
}



举报

相关推荐

0 条评论