修改:以下示例不按照预期工作。对于此问题,Steve Jessop的答案是正确的。已使用更正的示例创建new question。根据社区规则,可能会删除该问题。或者可以将主体缩短为“是否可以在基类的指针上调用静态成员函数(指针)?”以下示例匹配答案。示例下方的更多细节(cocos2d-x)部分可能会被删除。
在基类的指针上调用静态成员函数(指针)是否“安全”(和/或可移植),但该对象是不同的派生类。
class Base { /* ... */ }
class DerivedA : public Base {
/* ... */
static void doSomethingStaticA(float f);
}
class DerivedB : public Base { /* ... */ }
typedef void (Base::*SEL_SCHEDULE)(float);
SEL_SCHEDULE pCallback = (&DerivedA::doSomethingStaticA);
DerivedB db = new DerivedB();
Base *b = &db;
/* pCallback and b are saved in a list elsewhere (a scheduler) which calls */
b->pCallback(0.f);
这个似乎可以正常工作(在MSVC / Debug模式下),但是我想知道这是不是Bad(TM) - 为什么? (我还没有用Android和iOS的编译器来测试这段代码。)
如果需要,可以提供更多细节:我正在构建基于cocos2d-x的项目。 Base
为CCObject
,DerivedA
和DerivedB
是CCLayer
的子类。
层次结构为DerivedA
和DerivedB
< CCLayer
< CCNode
< CCObject
DerivedA
有一个不同的静态函数来设置音乐播放,它接收CCNode
来电者对象作为参数,schedules另一个selector doSomethingStaticA
)开始播放并使用以下内容慢慢淡化它:
callerNode->schedule(schedule_selector(DerivedA::doSomethingStaticA), 0.05f);
doSomethingStaticA
执行such as
CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(sFadeMusicVolume);
在运行时对doSomethingStaticA
的调用发生在CCTimer::update。
答案 0 :(得分:1)
你甚至不能用pCallback
初始化&DerivedA::doSomethingStaticA
,因为指向静态成员函数的指针实际上是指向函数的指针,而不是指向成员函数的指针。
所以有些东西是坏的,即使只是你的示例代码;-)同样b->pCallback
也许应该是b->*pCallback
,new
返回一个不能用于初始化的指针db
,有一些缺失的冒号,也许还有其他我错过的问题。编写一个简短的程序,编写,发布并询问有关该程序的问题。