• 程序挂在dynamic_cast<CCObject*>(pDelegate)->retain();


    CCTargetedTouchDelegate 的继承 和 dynamic_cast

    想写个可以响应touch的sprite

    类定义成了这个样子:

    [cpp] view plaincopy
     
     
    1. class GemBoard : public CCSprite, CCTargetedTouchDelegate  


    然后注册touch消息的时候

    [cpp] view plaincopy
     
     
    1. CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);  


    在这挂了,查了一下午,挂在了

    -addTargetedDelegate

        -CCTargetedTouchHandler::handlerWithDelegate

            -initWithDelegate

                 -CCTouchHandler::initWithDelegate

                      -dynamic_cast<CCObject*>(pDelegate)->retain();

                             -void CCObject::retain(void)

    跟到这里,编译器告诉我CCObject的this指针是0,我晕呀。感觉太诡异了。

    原因:CCTargetedTouchDelegate在上面的写法中是私有继承,而根据dynamic_cast的作用:(运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。)上面的情况就合情合理了。

    今天学到了2个知识点:

    1. class B: public A, C  这种情况下A是public继承,C是private继承;class B: A 这个A也是private继承

    2.dynamic_cast 除了public 的其他都返回null

    所以改成

    [cpp] view plaincopy
     
     
    1. class GemBoard : public CCSprite, public CCTargetedTouchDelegate  

      //改成public继承就可以

    就正确了。发现自己的c++基础真烂。

  • 相关阅读:
    WindowsServer 2016激活
    selenium浏览器复用与原理分析
    react脚手架: 配置代理
    网络请求方式
    Java: Excel导入导出
    react 组件通信方式
    react: reactrouterdom
    react: 高阶函数及函数柯里化
    react: 事件处理
    react: 生命周期
  • 原文地址:https://www.cnblogs.com/DswCnblog/p/4006819.html
Copyright © 2020-2023  润新知