我眼里的RuntimeClass实现

原创 2002年01月17日 10:19:00

最近开始学习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;
}

 

 

 

 

十年磨一剑之我眼中的京东

记得第一次在京东上购物还要回退到2009年,当时叫京东商城,从此和京东结缘,一直在京东上买东西,记得以前还不支持货到付款,现在方便多了,不仅货到付款,而且可以刷卡,这种体验是非常好的。我们公司还经常从...
  • dotnetstudio
  • dotnetstudio
  • 2015年01月09日 23:00
  • 2856

近视眼从800度降到现在的100度。我今年25岁(转)

近视(尤其是高度近视),眼球会被眼周肌肉拉长(不是睫状肌拉长的,睫状肌只能纵向调节晶状体)。导致视远时,晶状体的屈光的焦点不能落在视网膜上。但通过练习,可以有意识地控制眼周肌肉压缩眼球(主要依据是可以...
  • thy822
  • thy822
  • 2016年03月27日 11:16
  • 4829

ArcEngine 鹰眼功能C#实现

ArcEngine开发之鹰眼功能C#实现        鹰眼作为AE系统一项基本功能,经常见于AE开发中。网上鹰眼功能实现大同小异,本文所写示例仅作参考及记录。        一、效果图       ...
  • sean4m
  • sean4m
  • 2016年05月08日 23:34
  • 3962

如何实现设计师眼里的虚线

在android中如何实现虚线的绘制
  • jys1115
  • jys1115
  • 2015年05月10日 20:38
  • 559

在程序员的眼里,用户是这样使用他们开发的软件的

我曾经说过,程序员不是一般的人,是具有某种超能里的人。但问题是,程序员往往意识不到自己的这种特异功能,在他们的眼里,会认为自己很普通,跟常人一样,所以,程序员能做到的事情,其他人——比如他们的客户/软...
  • qq_16686565
  • qq_16686565
  • 2014年07月15日 11:09
  • 372

博客专栏第一篇文章——我眼里的DBA

在专职DBA工作一年过一个月以后,开通了CSDN的博客专栏,在第一篇文章中,我谈谈一年DBA生涯的感想,虽然我是SQL Server的DBA,但是我觉得本文适合所有DBA,顺便把这篇文章作为个人真正D...
  • DBA_Huangzj
  • DBA_Huangzj
  • 2012年08月08日 21:27
  • 14212

01-大话程序猿眼里的高并发

高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC暴击了一...
  • lmjy102
  • lmjy102
  • 2017年11月18日 21:18
  • 270

测试眼里的Hadoop系列 之Terasort

TeraSort是Hadoop的测试中很有用的一个工具,但以前只是粗略的知道它的功能和用法,简单的用它做了几个测试用例。实际上,对于这种比较通用的工具,如果能够了解它更多一些的话,对于理解Hadoop...
  • yuesichiu
  • yuesichiu
  • 2013年12月13日 10:25
  • 7363

离人眼里的百度百态——献给过往

原文网址:http://blog.sina.com.cn/s/blog_5d9fd14a0100c2ex.html         在上海待了半年,仍然不怎么能适应外滩的冷。   本来要睡...
  • sa10011044
  • sa10011044
  • 2011年10月28日 23:43
  • 945

一个PostgreSQL用户眼里的Oracle性能优化

最近刚看完《Oracle性能优化求生指南》。这真是一本好书,全面而又深入的阐述了Oracle性能优化的方方面面,并且全书结构清晰,语言生动易懂。除了感叹作者非凡的功力,也由衷感谢三位译者(都是技术牛人...
  • bb6lo
  • bb6lo
  • 2015年09月21日 13:48
  • 401
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我眼里的RuntimeClass实现
举报原因:
原因补充:

(最多只允许输入30个字)