电脑教程中文网
首页  动态网站建设学习 程序  笑话  论坛 娱乐  交友 ADSL  峄城  成功者
中文名:电脑教程中文网,收集了大量的电脑教程! 编程技术文档 游戏开发 笑话站暂时关闭 设为首页
网页设计 HTML | Dreamweaver | CSS | Firework | FrontPage WEB开发 ASP | JSP | PHP | .NET | CGI | JS | VBS | XML | IIS6 | Apache | PWS
程序设计 Java | C++ |VC++ | C# | Delphi | VB | C语言 | 汇编 | Pascal | Perl 数据库 MSSQL | MySQL | Access | VF | Oracle | DB2 | SYBASE |
办公软件 Word | Excel | WPS | PowerPoint 动画平面 Photoshop | ACDSee | 3Dmax | Flash | Coreldraw |
操作系统 Windows 2000 | Windows XP | Windows 2003 | SCO Unix | Windows Vista | unix、Linux | 综合| 服务器 | 系统安全| 黑客技术
其  他 UltraDev | DOS | UML | PWS | Powerbuilder | 开发心得 | 设计理念 | 病毒库 | 其他 | LightTPD (分类排序给您带来不便请谅解)
推  荐: Java文档500篇》《ASP.NET与相关数据库技术高级指南》《TC图形函数详解》《C函数速查手册》《C语言编程宝典之一》《MFC深入浅出》《黑客零起点》《VC++ 编程指南》《JScript 用户指南》 《CSS教程宝典》《Microsoft Jet SQL 参考》《delphi技巧集合》《MySQL 4.1.0 中文参考手册》《MySQL中文手册
【导航】 您现在的位置 : 首页 - VC教程 - 《VC++精华技术文档收集》- 我眼里的RuntimeClass实现

我眼里的RuntimeClass实现

日期:2005-11-29 17:52:23 作者:佚名 人气: 来源:CSDN




最近开始学习VC了,谈谈心得吧。班门弄斧,请多多指教。

心得之一:

MFC中RuntiemClass支持的实现:

只要是从CObject派生的类,可以轻松实现RuntiemClass支持。当然,是通过编译器提供的宏来实现的。那么其实现机制是怎样的呢?我觉得只需要四个步骤。

首先让我们简化一下CRuntiemClass和CObject的定义,抽取出与RuntiemClass相关的部分:

struct CRuntimeClass
{
 char m_lpszClassName[255];
 int m_nObjectSize;
 CObject* (*m_pfnCreateObject)();
 CObject* CreateObject();
};

class CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const {return NULL;}
 static CRuntimeClass classCObject;
 virtual ~CObject(){};
protected:
 CObject(){printf("CObject constructed\n");}
};

我所说的四个步骤是(下面的操作都是对于从CObject派生的类而言的):

1.添加CRuntiemClass类型的静态成员classCMyClass(请把CMyClass换成你的类名)

        static CRuntimeClass classCMyClass;

2.覆盖父类(即CObject)的GetRuntimeClass()方法,使之返回classCMyClass的指针

3.添加并实现 CreateObject();方法。

  声明: static CObject* CreateObject();

  实现:CObject* CMyClass::CreateObject() { return new CMyClass;  }

4.为classCMyClass赋值。使m_lpszClassName="CMyClass";

    m_nObjectSize=sizeof (CMyClass);

     函数指针m_pfnCreateObject指向CMyClass::CreateObject。

       CRuntimeClass CMyClass::classCMyClass=   {"CMyClass",sizeof (CMyClass),
                                                                        CMyClass::CreateObject};

附上完整的例程(摘自Programming Visual C++6.0 Unleashed):

#include <stdio.h>
#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)

class CObject;
struct CRuntimeClass
{
 char m_lpszClassName[21];
 int m_nObjectSize;
 CObject* (*m_pfnCreateObject)();
 CObject* CreateObject();
};

class CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const {return NULL;}
 static CRuntimeClass classCObject;
 virtual ~CObject(){};
protected:
 CObject(){printf("CObject constructed\n");}
};

CRuntimeClass CObject::classCObject=
    {"CObject",sizeof(CObject),NULL};

CObject* CRuntimeClass::CreateObject()
{
 return (*m_pfnCreateObject)();
}

class CAlpha:public CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const
 {
  return &classCAlpha;
 }
 static CRuntimeClass classCAlpha;
 static CObject* CreateObject();
protected:
 CAlpha(){printf("CAlpha constructor\n");}
};

CRuntimeClass CAlpha::classCAlpha={"CAlpha",sizeof(CAlpha),CAlpha::CreateObject};

CObject* CAlpha::CreateObject()
{
 return new CAlpha;
}

class CBeta:public CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const {return &classCBeta;}
 static CRuntimeClass classCBeta;
 static CObject* CreateObject();
protected:
 CBeta(){printf("CBeta constructed\n");}
};
   CRuntimeClass CMyClass::classCMyClass=   {"CMyClass",sizeof (CMyClass),
    CMyClass::CreateObject};

 

CRuntimeClass CBeta::classCBeta={"CBeata",sizeof(CBeta),CBeta::CreateObject};

CObject* CBeta::CreateObject()
{
 return new CBeta;
}

class CGama:public CObject
{
public:
 virtual CRuntimeClass* GetRuntimeClass() const { return &classCGama;}
 static CRuntimeClass classCGama;
 static CObject* CreateObject();
protected:
 CGama(){printf("CGama constructed\n");}
};

CRuntimeClass CGama::classCGama={"CGama",sizeof(CGama),CGama::CreateObject};

CObject* CGama::CreateObject()
{
 return new CGama();
}

int main()
{
 printf("Entering dynCreate main\n");

 CRuntimeClass* pRTCAlpha=RUNTIME_CLASS(CAlpha);
 CObject* pObj1=pRTCAlpha->CreateObject();
 printf("class of pObj1=%s\n",pObj1->GetRuntimeClass()->m_lpszClassName);
 
 CRuntimeClass* pRTCBeta=RUNTIME_CLASS(CBeta);
 CObject* pObj2=pRTCBeta->CreateObject();
 printf("class of pObj2=%s\n",pObj2->GetRuntimeClass()->m_lpszClassName);

 CRuntimeClass* pRTCGama=RUNTIME_CLASS(CGama);
 CObject* pObj3=pRTCGama->CreateObject();
 printf("class of pObj3=%s\n",pObj3->GetRuntimeClass()->m_lpszClassName);

 
 delete pObj1;
 delete pObj2;
 delete pObj3;

 return 0;
}

 

 

 

 




网站首页 - 友情链接 - 公司简介 - 联系方式 - 广告投放 - 客户服务 - 错误报告 - 免责声明 - About us
CLDE.NET电脑教程中文网版权所有 未经许可禁止镜象和复制本站资料 MSN:CLDE_NET@hotmail.com
技术支持:CLDE.NET信息中心 鲁ICP备05039940号 友情链接QQ:784079(隐)

"