我在cocos2d-x的源码中看到了这么一段
typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
然后是
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
最后是
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
大致意思明白,就是点击图片的时候用HelloWorld::menuCloseCallback这个方法做响应,但是不明白的是,参数怎么可以是一个函数呢?不太理解,应该和typedef有关系吧。
但就是typedef void (CCObject::*SEL_MenuHandler)(CCObject*);这句话我看不太懂!有没有大神帮我解释一下,越详细越好。把我当成傻瓜来教哈。
SEL_MenuHandler
只能指向CCObject的类方法吗?
不论静态方法,动态方法?
能指向CCObject的子类的方法吗,并且这个方法是子类自己特有的,不是继承或实现父类的方法?
是的,只能指向定义的指针类型,参数类型,返回值类型的需要匹配的;
若要访问子类或其他类型的函数需要强制指针类型转换,这样转换后能访问这样的函数,但得到的结果不正确
你可以尝试一下,比如子类的某个函数,其他类型的函数,静态的函数都可以试一下;能不能访问,结果正不正确,为什么?
访问子类是可以的
SEL_MenuHandler
只能指向CCObject的类方法吗?
不论静态方法,动态方法?
能指向CCObject的子类的方法吗,并且这个方法是子类自己特有的,不是继承或实现父类的方法?
因为使用CCObject 类限定符限定了,所以只能指向该类的方法,并且不是静态方法,静态方法的话声明不能这么声明了。不太一样的。
子类的方法的话,如果这个方法是父类里有的,那么也是可以的,因为是从父类中继承过来的。如果不是继承的话,那肯定不行了。因为你声明的函数指针必须是CCObject类型的函数指针,而不是声明的他的子类的。
那最后问一句哈,既然你提到了静态方法的话声明不能这么声明了。那如果是类的静态方法该怎么去,定义函数指针呢,刚百度了下,没找到满意答案!
追答静态方法跟普通的函数指针方法一样的,定义的时候把类的限定符去掉就可以了。
typedef void (*SEL_MenuHandler)(CCObject*);
这样就可以了。