码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-05 12:21:38      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:blog   http   ar   strong   sp   div   art   c   on   

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++基础真烂。

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

标签:blog   http   ar   strong   sp   div   art   c   on   

原文地址:http://www.cnblogs.com/DswCnblog/p/4006819.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!