我眼里的RuntimeClass实现

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

 

 

 

 

获取Runtime类对象 获取Runtime类对象的相关代码分析 文章目录获取Runtime类对象的相关代码分析很重要的知识点getMethod和invoke获取Runtime类对象另一种写法 本文参考P佬的java安全漫谈 很重要的知识点 invoke的作用是执行方法,它的第一个参数是 如果这个方法是一个普通方法,那么第一个参数是类对象 如果这个方法是一个静态方法,那么第一个参数是类 getMethod和invoke 这里对getMethod和invoke进行分析 getMethod 的作用是通过反射获取一个类的某个特定的公有 阅读详情

相关推荐

GetRuntimeClass(void)const error

今天想实现一个不规则窗口弹出的功能,以后加到产品中去。期间还是遇到几个小问题。::GetRuntimeClass(void)const " (?GetRuntimeClass@CTaskbarNotifier@@UBEPAUCRuntimeClass@@XZ)这个link error 发现 because 从cwnd继承时     DECLARE_DYNAMIC(CTaskbarNotifier)

眼界决定世界 奋斗成就梦想 3897

眼里RuntimeClass实现 (转)

眼里RuntimeClass实现 (转)[@more@]最近开始学习VC了,谈谈心得吧。班门弄斧,请多多指教。 心得之一: MFC中RuntiemClass支持的实现: 只要是从Cobject派生的类,可以轻松实现Ru...

cuiji1279的博客 108

5.1运行时类信息CRuntimeClass

CRuntimeClass类 在程序运行的过程中辨别对象是否属于特定类的技术叫动态类型识别(Runtime Type Infomation,RTTI)。当函数需要识别其参数类型的时候,或者是必须针对对象所属的类编写特殊目的的代码时,运行期识别就变得非常有用了。 框架程序使用这一技术管理应用程序是非常方便的,因为用户可以任意设计自己的类,框架程序可以在程序执行的时候知道这个类的类名、大小等信息,并能创建这个类的对象。 动态类型识别和动态创建 如何识别对象是否属于某个类呢?区别进程可以使用进程ID,区别窗口可以

qq_36314864的博客 845

CRuntimeClass

眼里RuntimeClass实现 (转) 最近开始学习VC了,谈谈心得吧。班门弄斧,请多多指教。 心得之一: MFC中RuntiemClass支持的实现: 只要是从Cobject派生的类,可以轻松实现RuntiemClass支持。当然,是通过编译器提供的宏来实现的。那么其实现机制是怎样的呢?我觉得只需要四个步骤。 首先让我们简化一下CRuntiemClass和CO

xuwentao37x的专栏 880

找不到 GetRuntimeClass 函数的定义

上面的语句在头文件的类中定义, 下面的语句在源文件中定义, 将头文件的这句注释掉后就能编译成功..但是显然这并不是理想的结果, 跟其他文件比较一番发现是下面的这个语句写的位置不对, 他应该写在头文件的下方, 这样编译就能通过了.MFC开发过程中, IDE用的VC6, 因此有时候创建新界面就很麻烦, 创建时可能有选项选不了, 无法指定界面是哪个类, 因此照着其他的改, 手动将ResourceView和FileView绑定, 这个过程中出了一点点问题.

weixin_53173551的博客 286

无法解析的外部符号 "public: virtual struct CRuntimeClass

无法解析的外部符号 "public: virtual struct CRuntimeClass * __thiscall CMessageBox::GetRuntimeClass(void)const " 以下原因是会引起上述错误的:   1,在.h文件中写了DECLARE_DYNAMIC,而在.cpp文件中没有写IMPLEMENT_DYNAMIC    2,在.h文件中写了DECLAR

狼牙 1万+

Runtime.class有什么用

Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running.

Mr_Susy的博客 568

C++动态识别与生成以及在MFC CRuntimeClass的应用

P>C++语言的爱好者们,不知你们注意到了没有,在编写某些程序时,如果能够根据一个类的名字动态地生成此类, 那么,整个程序的结构就能够非常简练.举个例子,你的程序需要用到一个文本文件,而此文件中存放着一些类的名 字,你能根据这些名字动态的生成这些类吗?让我们试着编写如下代码: char szClassName[20] /***********************************

一个早起的程序员 2316

课时 30:理解 RuntimeClass 与使用多容器运行时(贾之光)

本文将主要分享以下三方面的内容: RuntimeClass 需求来源 RuntimeClass 功能介绍 多容器运行时示例 RuntimeClass 需求来源 容器运行时的演进过程 我们首先了解一下容器运行时的演进过程,整个过程大致分为三个阶段: 第一个阶段:2014 年 6 月 Kubernetes 正式开源,Docker 是当时唯一的、也是默认的容器运行时。 第二个阶段:Kubernet...

阿里巴巴云原生的博客 522

java runtime.exec() 的编写

java runtime.exec() 的编写  那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的。我说几个自己觉得重要的地方。1、Runtime.getRuntime()可以取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法。2、Runtime上其他大部分的方法都是实例方法,也就是说每次进行运行时调用时都要用

xymyeah 2777

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能和windows“运行”类似。

qq1091606981的专栏 1万+

MFC】10.MFC六大机制:RTTI(运行时类型识别),动态创建机制,窗口切分,子类化-笔记

MFC六大机制:RTTI(运行时类型识别),动态创建机制,窗口切分,子类化

WdIg-2023的博客 1360

MFC 运行时类信息机制

MFC 运行时类信息机制

qq_61553520的博客 953

深入浅出mfc 运行时类型识别(RTTI 、DECLARE_DYNAMIC)、动态创建( DCLARE_DYNCREATE)、永久保存(DECLARE_SERIAL)

只有用DECLARE_DYNAMIC,DECLARE_DYNCREATE或DECLARE_SERIAL定义的CObject的派生类才能返回CRuntimeClass结构指针。4. 程序的模块状态中有所有的RuntimeClass的列表,因此,查找对应的程序支持的RuntimeClass(对比ClassName),获得对应的RuntimeClass;//初始化一个名为"_init_##class_name"的AFX_CLASSINIT静态结构,主要作用是给指定的class_name的。

baidu_16370559的博客 1587

MFC的Cobject基类及其派生类获取运行时类信息

MFC的CObject基类定义有public的virtual CRuntimeClass *GetRuntimeClass() const;是用来返回多态运行时类信息的虚方法,将运行时类信息封装进了结构体CRuntimeClass

HayPinF的博客 1265
forest
博客等级 码龄27年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值