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
为何说要用到动态创建呢,因为我们不仅需要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
相关文章推荐
- vc++实现反射式数据库模版(3.序列化、反序列化与消息映射)
- vc++实现反射式数据库模版(1.运行时类识别)
- vc++实现反射式数据库模版(4.实现数据库模版)
- MVC5+EF6入门教程——实现动态创建数据库与登录验证
- 关于数据库动态列呈现的实现方案---创建动态类或为Table添加TableRow
- vc下动态创建access数据库的实现
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- VC实现动态菜单的创建方法
- VC实现动态菜单的创建方法
- vc下动态创建access数据库的实现
- vc下动态创建access数据库的实现
- 通过动态代理(Proxy)实现的数据库连接池的创建连接与归还链接的操作的简单的实现流程
- php录入页面中动态从数据库中提取数据的实现
- vc+ado动态创建access数据库
- 动态创建DataGrid的模版列
- ASP.NET中实现模版的动态加载(转)
- VC实现波形不闪烁动态绘图,转载
- VC程序中实现控件的动态生成与响应
- 在VB6中动态创建使用ADO控件访问数据库
- 动态创建DataGrid的模版列