IsKindOf()函数
来源:互联网 发布:手机赚钱软件,提现微信 编辑:程序博客网 时间:2024/05/21 10:31
知道有IsKindOf这么个函数,用来检测:(1)对象是否属于指定的类,(2)对象是否属于指定类派生的类,但是一直没用过,今天用了下,提示错误error C2039: 'classXXX' : is not a member of 'XXX',查了很多资料,才把它搞明白,记录如下:
1、对使用IsKindOf这个函数的类要在.h文件夹里定义DECLARE_DYNAMIC或DECLARE_SERIAL宏
- class CDlgTest : public CDialog
- {
- DECLARE_DYNAMIC( CDlgTest )
- // Construction
- public:
- CDlgTest(CWnd* pParent = NULL); // standard constructor
- ...
- ...
- };
2、需要在.cpp文件中加入IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL宏
- IMPLEMENT_DYNAMIC(CDlgTest, CDialog)
- CDlgTest::CDlgTest(CWnd* pParent /*=NULL*/)
- : CDialog(CDlgTest::IDD, pParent)
- {
- ...
- }
3、使用时,CDlgTest dlg;
if(dlg.IsKinfOf(CDialog))...
随后又研究了一下这几个宏,也算明白了IsKindOf的实现原理,做下简单记录:
1、DECLARE_DYNAMIC宏
- #define DECLARE_DYNAMIC(class_name)/
- public:/
- static CRuntimeClass class##class_name;/
- virtual CRuntimeClass* GetRuntimeClass() const;
2、IMPLEMENT_DYNAMIC宏
- #define IMPLEMENT_DYNAMIC(class_name,bass_class_name)/
- _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)
- #define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)/
- static char _lpsz##class_name[]= #class_name;/
- CRuntimeClass class_name::class##class_name = {/
- _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/
- RUNTIME_CLASS(base_class_name),NULL};/
- static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);/
- CRuntimeClass* class_name::GetRuntimeClass() const/
- { return &class_name::class##class_name;}
3、IsKindOf函数的实现
- BOOL CObject::IsKindof(const CRuntimeClass *pClass) const
- {
- CRuntimeClass* pClassThis=GetRuntimeClass();
- while(pClassThis != NULL)
- {
- if(pClassThis==pClass)
- return TRUE;
- pClassThis=pClassThis->m_pBaseClass;
- }
- return FALSE;
- }
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".
- IsKindOf()函数
- IsKindOf()函数
- IsKindOf()函数
- IsKindOf()函数
- 如何在对话框中使用IsKindOf函数
- CObject::IsKindOf
- IsKindOf的用法简介
- DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf
- DYNAMIC_DOWNCAST、STATIC_DOWNCAST、CRuntimeClass和IsKindOf
- C++:实现类似MFC的IsKindOf功能
- desc() isKindOf() cast() isA() 区别和用法
- 《深入浅出MFC》第109页,关于Iskindof的介绍
- c++自定义类实现MFC中IsKindOf功能
- cocos-lua 多重继承的iskindof的BUG
- MFC框架仿真---(1)类别信息网之IsKindOf()【型别辨识】
- 函数
- 函数
- 函数
- 史上最全的ios源码汇总
- 关于C/C++中的trigraph
- C#作为客户端调用gsoap生成的C++服务端
- WiEngine介绍
- 快速搭建MongoDB分片集群
- IsKindOf()函数
- Android4.0 源代码目录结构
- 【codeforce】B. Flag Day
- 第一次创业,真的是很那个的(转自cnblogs)
- java 对象转 json 和 xml
- 内存管理由mrc转为arc
- linux socket服务器框架
- 菜鸟学Linux------代码编译问题
- 一般函数指针和类的成员函数指针