您的位置:首页 > 编程语言 > C语言/C++

vc++实现反射式数据库模版(2.动态创建)

2017-02-22 16:18 357 查看
接上篇vc++实现反射式数据库模版(1.运行时类识别)

 

为何说要用到动态创建呢,因为我们不仅需要insert还需要select,我们把查询到的结果反向填充到类和对象中,就需要实例化我们的类。然后把填充好的对象返回出去就可以使用得到的对象了,多么灵活。

实现动态创建我们所做的只需要在运行时类识别基础上增加动态创建相应的操作就可以了,这节就不进行与MFC代码对比了,有兴趣可以自己跟踪对比下。

首先要实现对象的创建需要在合适位置new该类。这个操作就添加到宏的内部。

#define TDDECLARE_DYNCREATE() \
public: \
    static TDRuntimeClassrunclass_name; \
    static TDObject* PASCALCreateObject();\
    virtual TDRuntimeClass*GetRunTimeClass()
const;\
    可以发现在初始化宏中增加了CreateObject()静态函数,该函数就是用来实现对该类的创建过程。
 
    #defineTDIMPLEMENT_DYNCREATE(class_name) \
    TDObject * PASCAL class_name::CreateObject() \
    { return
newclass_name; } \
    TDRuntimeClass class_name::runclass_name = {\
    #class_name,class_name::CreateObject};\
    static TD_CLASSINIT_init_##class_name(&class_name::runclass_name);\
    TDRuntimeClass* class_name::GetRunTimeClass()
const\
    {return&class_name::runclass_name;}\
    在实现宏中对该类进行new,并且把创建函数指针传递到运行时结构用与初始化,创建时就可以直接通过运行时链表中调用该创建函数。以下是对运行时结构的修改:
struct TDRuntimeClass
{
    LPCSTR m_lpszClassName;
    TDObject * (PASCAL* m_pfnCreateObject)();
    TDObject * CreateObject();
    static TDRuntimeClass*m_pFirstClass;    

    TDRuntimeClass* m_pNextClass;     
};
 
    试用:
    讲了那么久也该试用下成果了。首先创建TDObject做为基类,初始化上面代码,然后创建其子类,在类的声明加上TDDECLARE_DYNCREATE(),类的实现加上TDIMPLEMENT_DYNCREATE(子类名)。在main函数中进行测试。
TDRuntimeClass* RuntimeClass= TDRuntimeClass::m_pFirstClass;
while(RuntimeClass)
{
    cout<<RuntimeClass->m_lpszClassName<<endl;
    RuntimeClass = RuntimeClass->m_pNextClass;
}
这几行打就可以打印出子类名称。代码在后面给予链接。



 
 
 

但是我们还需要我们的成员变量的名称,别急,接下来我们就实现它。下一节我们要简单介绍MFC序列化及我们自己实现成员变量信息的读取与写入。

 

源码下载 http://download.csdn.net/detail/u011736517/9760866
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息