也许是C++初学者的问题,关于typedef的问题

我在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*);这句话我看不太懂!有没有大神帮我解释一下,越详细越好。把我当成傻瓜来教哈。

函数指针,用来指向一些代码;将一些代码的首地址传递给这个指针,函数名就是函数的首地址;这样就可以传递一个函数了

void (CCObject::*SEL_MenuHandler)(CCObject*);这个函数指针定义了一个类型的函数,这个类型的函数返回值是void 参数是CCObject*追问

SEL_MenuHandler
只能指向CCObject的类方法吗?
不论静态方法,动态方法?
能指向CCObject的子类的方法吗,并且这个方法是子类自己特有的,不是继承或实现父类的方法?

追答

是的,只能指向定义的指针类型,参数类型,返回值类型的需要匹配的;

若要访问子类或其他类型的函数需要强制指针类型转换,这样转换后能访问这样的函数,但得到的结果不正确

 

你可以尝试一下,比如子类的某个函数,其他类型的函数,静态的函数都可以试一下;能不能访问,结果正不正确,为什么?

访问子类是可以的

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-12
定义了一个函数指针 定义了一个函数类型。

void (CCObject::*SEL_MenuHandler)(CCObject*); 函数

里面 sel_menuhandler 是函数指针类型本回答被网友采纳
第2个回答  2013-11-12
你是没学过函数指针么吗?指针可以指向一个函数的,这样的话就可以将一个函数,其实是函数的入口地址当做参数来传递到了,这样的话就可以将一个函数当做参数传入另一个函数,这样在内部就可以调用这个传入的函数,这样可以实现你要求的效果。也可以叫做回调函数,你查一查函数指针可以得到更加专业的回答。追问

SEL_MenuHandler
只能指向CCObject的类方法吗?
不论静态方法,动态方法?
能指向CCObject的子类的方法吗,并且这个方法是子类自己特有的,不是继承或实现父类的方法?

追答

因为使用CCObject 类限定符限定了,所以只能指向该类的方法,并且不是静态方法,静态方法的话声明不能这么声明了。不太一样的。
子类的方法的话,如果这个方法是父类里有的,那么也是可以的,因为是从父类中继承过来的。如果不是继承的话,那肯定不行了。因为你声明的函数指针必须是CCObject类型的函数指针,而不是声明的他的子类的。

追问

那最后问一句哈,既然你提到了静态方法的话声明不能这么声明了。那如果是类的静态方法该怎么去,定义函数指针呢,刚百度了下,没找到满意答案!

追答

静态方法跟普通的函数指针方法一样的,定义的时候把类的限定符去掉就可以了。
typedef void (*SEL_MenuHandler)(CCObject*);

这样就可以了。

第3个回答  2013-11-12
这里是函数指针的应用 百度一下函数指针
相似回答
大家正在搜