• DYNAMIC_DOWNCAST STATIC_DOWNCAST IsKindOf


     

    DYNAMIC_DOWNCAST(class, pointer ):如果pointer指针所指向的对象是class类型的,就返回这个指针。否则返回NULL

    pwnd 你获取到的指针

    class 你的类

    class A;

    例如 你获取到一个指针 XXX *pointer; 你想判断它是不是指向某个类 例如   A 这个类

    A* p= DYNAMIC_DOWNCAST(A, pointer );

    如果pointer是指向A这个类则返回此指针,否则返回空

    CRuntimeClass和IsKindOf的关系

    CRuntimeClass在MFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从A到B的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。

     

    动态确定类

        在MFC中

    BOOL CObject::IsKindOf(

       const CRuntimeClass* pClass  

    ) const;

    利用CRuntimeClass来进行判定,如果你生成的类是以CFrameWnd为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。

    -----------------------------------------------------------------------------------------------------------------------------------------------

     

     

     

    #include <afxwin.h>

     

     

    class Type1public CObject {};        //类型一,从CObject派生

    class Type2public CFrameWnd {};    //类型二,从CFrameWnd派生

     

    BOOL IsType1(CObject *pFrameWnd)    //判断函数

    {

         return pFrameWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd));    //判断是不是CFrameWnd的类型,请注意这里的红色字体

    }

    BOOL IsType2(CObject *pObject)

    {

        return pObject->IsKindOf(RUNTIME_CLASS(CObject));    //判断是不是CObject类型

    }

     

     

    int main()

    {

         Type1 t1;

         Type2 t2;

         ASSERT(IsType1(&t1) == FALSE);    //返回假.因为t1不对应CFrameWnd的类型

         ASSERT(IsType1(&t2) == TRUE);     //正确.t2对应CFrameWnd的类型

        ASSERT(IsType2(&t1) == TRUE);    //t1就是从CObject派生

        ASSERT(IsType2(&t2) == TRUE);    //t2也是从CObject派生    <类型识别网>

         return 0;

    }

     

    STATIC_DOWNCAST

    强制转换为指向 CYourDocument,称为 pYourDoc 是指向 CDocument 使用下面的表达式的指针的指针:  

    CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);

  • 相关阅读:
    ajax 发送 json 数组
    h5拖动总结
    TypeScript 学习
    java程序员面试经历(不忘初心,永不放弃,方得始终)。
    mysql统计天、周、月、季度、半年、年
    C++错误unresolved external symbol _WinMain@16
    记mysql条件分支语句CASE WHEN THEN ELSE END的使用
    freemarker数据格式化问题(即数值超过三位后自动添加逗号问题)
    tomcat启动内存溢出三种解决方案:java.lang.OutOfMemoryError:PermGen space解决办法
    Spring事务异常回滚,捕获异常不抛出就不会回滚
  • 原文地址:https://www.cnblogs.com/bigbigtree/p/2289793.html
Copyright © 2020-2023  润新知