IsKindOf()函数

C++:实现类似MFC的IsKindOf功能 假设需要一个类别库,改类别库共包含以下5个类:GrandFather(祖父类)、Father(父类)、Son(儿子类)、Daughter(女儿类)、GrandSon(孙子类) 各个类之间的继承关系为: 相应的代码为: class GrandFather { }; class Father:public GrandFather { }; class Son:pu 阅读详情

知道有IsKindOf这么个函数,用来检测:(1)对象是否属于指定的类,(2)对象是否属于指定类派生的类,但是一直没用过,今天用了下,提示错误error C2039: 'classXXX' : is not a member of 'XXX',查了很多资料,才把它搞明白,记录如下:

1、对使用IsKindOf这个函数的类要在.h文件夹里定义DECLARE_DYNAMIC或DECLARE_SERIAL宏

[cpp]  view plain copy
  1. class CDlgTest : public CDialog  
  2. {  
  3.     DECLARE_DYNAMIC( CDlgTest )  
  4. // Construction  
  5. public:  
  6.     CDlgTest(CWnd* pParent = NULL);   // standard constructor  
  7.     ...  
  8.     ...  
  9. };  

2、需要在.cpp文件中加入IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL宏

[cpp]  view plain copy
  1. IMPLEMENT_DYNAMIC(CDlgTest, CDialog)  
  2.   
  3. CDlgTest::CDlgTest(CWnd* pParent /*=NULL*/)  
  4.     : CDialog(CDlgTest::IDD, pParent)  
  5. {  
  6.     ...  
  7. }  

3、使用时,CDlgTest dlg;

                 if(dlg.IsKinfOf(CDialog))...

 

随后又研究了一下这几个宏,也算明白了IsKindOf的实现原理,做下简单记录:

1、DECLARE_DYNAMIC宏

[cpp]  view plain copy
  1. #define DECLARE_DYNAMIC(class_name)/      
  2. public:/  
  3.     static CRuntimeClass class##class_name;/       
  4.      virtual CRuntimeClass* GetRuntimeClass() const;  

2、IMPLEMENT_DYNAMIC宏

[cpp]  view plain copy
  1. #define IMPLEMENT_DYNAMIC(class_name,bass_class_name)/  
  2.        _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)  
  3.   
  4. #define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)/  
  5.     static char _lpsz##class_name[]= #class_name;/  
  6.     CRuntimeClass class_name::class##class_name = {/  
  7.         _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/  
  8.             RUNTIME_CLASS(base_class_name),NULL};/  
  9.     static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);/  
  10.     CRuntimeClass* class_name::GetRuntimeClass() const/  
  11.         { return &class_name::class##class_name;}  

3、IsKindOf函数的实现

[cpp]  view plain copy
  1. BOOL CObject::IsKindof(const CRuntimeClass *pClass) const     
  2. {     
  3.     CRuntimeClass* pClassThis=GetRuntimeClass();     
  4.     while(pClassThis != NULL)     
  5.     {     
  6.         if(pClassThis==pClass)     
  7.             return TRUE;     
  8.         pClassThis=pClassThis->m_pBaseClass;     
  9.     }     
  10.     return FALSE;     
  11. }     

4、单行宏的定义

定义单行宏:主要有以下三种用法.

   1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不是字符串.多用于多行的宏定义中.例如:
#define A(x)  T_##x
则 int A(1) = 10; //等效于int T_1 = 10;
#define A(x)  Tx##__
则 int A(1) = 10; //等效于int T1__ = 10;
   2) 前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效
 #define B(x) #@x
 则B(a)即 'a',B(1)即 '1'.但B(abc)却不甚有效.
   3) 前加#,将标记转换为字符串.
 #define C(x) #x
 则C(1+1) 即 "1+1".
MFC框架仿真实战:深入理解IsKindOf()函数的型别辨识功能 MFC(Microsoft Foundation Classes)是一个C++库,它提供了一套丰富的类,用于简化Windows平台下应用程序的开发。MFC封装了Windows API的复杂性,让开发者能够以面向对象的方式进行编程。使用MFC,开发者可以利用类的继承、多态等面向对象的特性,构建功能丰富的应用程序。MFC的类层次结构是基于单根继承树设计的,其顶层是CObject类,几乎所有其他的MFC类都是从CObject派生的。CObject类提供了序列化、动态创建、对象诊断等特性。 阅读详情

相关推荐

MFC框架仿真---(1)类别信息网之IsKindOf()【型别辨识】

在构建类别信息网的基础上为对象添加型别辨识能力(也就是一个对象可以判断自己是否属于类别信息网中的某一个类类型)

IsKindOf(类型识别)

在CObject中添加一个IsKindOf函数,此函数将被所有的类继承,它把参数所指定的某个CRuntimeClass对象拿来与类别型录中的元素一一比较。比较成功(在型录中有发现)就传回TRUE,否则就返回FALSE。 //in head file class CObject { public: ...cpp BOOL IsKindOf(const CRuntimeClass* pClass) c...

l93919861的博客 2430

通过TMS320F28335学习DSP的开发流程——28335的基础知识(1)

1、TMS320F28335内核的主要特点 ①F28335 DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28335能够在一个周期内完成32x32位的乘法累加运算,或者两个16x16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成 ②快速的中断响应 ③可在任何内存位置进行单周期读、修改、写操作 ④可采用C/C++编程软件,效率非常高 2、处理器的主要资源 ①32位浮点DSP,主频是150MHz,方便电机控制、电力设备控制及工业控制等。 ②片上存储器:FLASH–

Kayboy的博客 2万+

IsKindOf的用法简介

IsKindOf的用法简介

浮城大亨的专栏 1675

windows10 + wsl2安装docker

一、安装wsl https://docs.microsoft.com/zh-cn/windows/wsl/install-win10 1.1以管理员身份运行powershell 1.2执行如下命令 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 1.3重启电脑 1.4 重启电脑后,如果需要安装wsl2, 则安装官方文档继续后续操作,因我...

happytree001的博客 1568

SAP Workflow审批功能实例详细过程

SAP Workflow审批功能实例详细过程

陈送平的博客 6566

objectarx2023开发记录(三)---isKindOf()函数

背景:由于使用acedSSGet()函数自主选择得到的选择集,包含除多段线以外的实体,在进行多段线处理时,容易造成CAD软件崩溃等问题,需要辨别出多段线类型,再进行处理。(2)然后调用isKindOf()函数,判断是否为多段线,若是进行多段线顶点坐标提取。使用isKindOf()函数前,必须保证实体已经打开。isKindOf()函数,用于辨别实体的类型,参数填写多段线类型即可实现多段线的提取。只输出两个多段线的坐标,圆弧、圆的实体被剔除不显示。(1)先通过AcDbEntity实体指针对象,打开实体。

Learning_Well的博客 234

从ISCXTor2016到CICIDS2017:手把手教你下载和使用UNB的网络安全数据集

本文详细介绍了UNB大学发布的ISCXTor2016和CICIDS2017等网络安全数据集的下载与使用方法,特别适合加密流量识别和网络行为分析研究。文章提供了多种高效获取路径、文件结构解析及实战分析示例,帮助研究者快速上手这些真实场景捕获的精细标注数据集。

weixin_42524945的博客 630

decs()、cast()、isKindOf()和isA()

desc():静态成员函数,返回指定类的一个类描述符对象。 cast(): 静态成员函数,返回指定类的类型的一个对象,如果对象不是属于该指定的类则返回NULL。 isKindOf():根据对象是否属于指定的类或其派生类返回真或假。 isA():返回一个未确定类的对象的类描述符对象。 //假设已经获得了对象的指针为curEntity if (cureEntity->isKindOf(AcD...

qq_41506111的博客 968

Xilinx ISE系列教程(2):LED点灯工程、仿真、bit下载和mcs固化

bit流生成配置选项很多,支持生成bit/bin/ascii格式的bin文件,是否压缩,配置速度,配置管脚的上下拉,用户ID,数据加载速度,SPI总线宽度,是否支持Readback,程序加密等等。,在之后的文章,我们会以Xilinx Spartan-6系列FPGA XC6SLX16为例,不涉及FPGA开发知识,仅仅是工具的使用,介绍Xilinx ISE开发环境的使用教程和使用技巧。bit文件下载之后,可以看到LED按照我们设计的1s周期闪烁起来了,但是此时如果断电,重新上电程序就丢失了。...

whik1194的博客 2278

手把手教你学Simulink--四翼无人机滑模控制器设计与仿真

四翼无人机(Quadcopter)滑模控制(Sliding Mode Control, SMC)是一种鲁棒性很强的非线性控制方法,特别适用于存在模型不确定性和外部扰动的情况。滑模控制器通过强制系统状态进入并保持在一个预定义的滑模面上,从而实现对期望轨迹或姿态的精确跟踪。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个基于滑模控制策略的四翼无人机系统。

MHD0815的博客 184

desc() isKindOf() cast() isA() 区别和用法

基础知识:a 正常情况下,基类指针调用基类成员(成员变量和成员函数);派生类指针调用派生类成员 b 公有派生时基类指针允许指向派生类对象,但只能调用派生类继承自基类的成员而不能访问扩展部分成员 c 以私有派生时,基类指针不允许指向派生类对象 d 派生类指针不允许指向基类对象另:基类的指针可以强制转换为派生类指针,反之不可。静态成员函数只能对类内静态数据成员访问,也允许调用另一个静态成员函数,但

十维的博客 1855

C#利用最小二乘法拟合任意次函数曲线

给出一组离散点,确定一个函数逼近原函数,插值是这样的一种手段。在实际中,数据不可避免的会有误差,插值函数会将这些误差也包括在内。因此,我们需要一种新的逼近原函数的手段: ①不要求过所有的点(可以消除误差影响);②尽可能表现数据的趋势,靠近这些点。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小 [1],其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达,具体可以查阅相关资料。最小二乘法(又称最小平方法)是一种数学技术。

qq_30725967的博客 3755

判断实体的类型 相关操作

desc() 静态函数,返回指定类的描述符。 cast() 静态函数,类型转换函数,将父类指针转换为指定类的指针,如果失败,返回NULL。 isKindOf() 虚函数判断是否指定类或它的派生类的实例。 isA() 虚函数,返回调用实例的类的描述符。 如有一个实体ID,但不知道是直线还是弧,可如下操作: AcDbEntity* pEnt = NULL; if (Acad::e...

620

记住这两个纯净版Windows11各系列版本系统下载网站

记住这两个纯净版Windows11各系列版本系统下载网站 HelloWindows是一个完整极致的Windows纯净系统下载站,不夹带任何私货,系统全部来源于微软官方原版,本站只是收录官方发布的系统以及工具,方便大家下载,请放心使用。永久在线:www.hellowindows.cn。HelloWindows.cn - 精校 完整 极致 Windows系统下载仓储站。

拥抱具身智能,昇腾Ascend C 7005

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

有多个视图时,从文档类获取指定视图类的指针

   从文档类取得视图类的指针:  CDocument类提供了两个函数用于视图类的定位:   GetFirstViewPosition()和GetNextView() 注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变.GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextVi

编码无悔 1521

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

CApp、CMainFrame、CView、CDoc之间相互通信

转自:https://blog.youkuaiyun.com/phpxin123/article/details/7437582 例如:我在CMainFrame 中写代码,要访问CVIEW类中的数据,该怎么写代码? 在CMainFrame 中,要访问CDOC类中的数据,该怎么写代码? CVIEW类要访问CDOC类中的数据,该怎么写代码?   假设你是单文档单个VIEW的程序。那么: 1...

qq_16334327的博客 626

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MFC关键技术模拟(4)------类型识别

接上一篇:http://blog.youkuaiyun.com/bzhou830/article/details/25725077

862

IsKindOf RUNTIME_CLASS

CObject::IsKindOf BOOLIsKindOf( const CRuntimeClass* pClass ) const; This function tests pClass to see if (1) it is an object of the specified class or (2) it is an object of a class derived from the specified class. This function works only for classe...

housecarl的博客 605

《深入浅出MFC》第109页,关于Iskindof的介绍

7.拼了,2000分拿下《MFC 深入浅出》 问题 3 。 ren20 ()     2001-02-15 08:51:00 在 VC/MFC / 基础类 提问每个问题100分,20个问题应该可以拿下深入浅出。呵呵         问题3:           〈MFC深入浅出〉  第109页,关于iskindof   的介绍。         我有一点不明白。         BOOL

饿的神啊 2329

如何在对话框中使用IsKindOf函数

 如何在对话框中使用IsKindOf函数 IsKindOf函数可以判断一个类指针指向的是否某个类的实例。 例子:pView->IsKindOf(RUNTIME_CLASS(CTestView));该例中,可以判断pView是否是CTestView类的实例。 但是对话框中,却不能直接使用IsKindOf函数,这里需要进行一下修改,具体如下: 1, 在.h文

stavck的专栏 3114

cocos-lua 多重继承的iskindof的BUG

cocos-lua的iskindof在多重继承时有一个BUG,如下: local A=class("ClassA") local B=class("ClassB",A) local binst= B.new() print( iskindof(binst,"ClassA") )ClassB继承自ClassA,因此B的对象理应也是ClassA的对象。但是输出结果却是

wonbit的专栏 2109

MFC不可不会

这些可能会很抽象,你既然学MFC,给你几个不可少的技术点1.Dynamic Creation2.Runtime Type Imformation3.Persistence4.Message Mapping5.Command Routing.以上5点自己去学吧,剩下的就仅仅是API的问题. 你的IsKindOf()就是RuntimeTypeImformation的支持...

weixin_34241036的博客 82
上一篇: 使用MiniDumpWriteDump API 来生成程序的Dump
下一篇: SGI STL 的内存管理
且行且探索
博客等级 码龄14年 26粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值