0

编辑:下面的例子不像想象的那样工作。对于这个问题,Steve Jessop的回答是正确的。已使用更正示例创建了一个新问题。根据社区规则,该问题可能会被删除。或者正文可以缩短为“是否可以在基类的指针上调用静态成员函数(指针)?” 用下面的例子来匹配答案。示例下方的更多细节(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的项目。BaseCCObjectDerivedA并且DerivedB是 的子类CCLayer

层次结构是DerivedADerivedB< CCLayer< CCNode< CCObject

DerivedA有一个不同的静态函数来设置音乐的播放,它接收一个CCNode调用者对象作为参数并安排另一个选择器doSomethingStaticA)开始播放并使用类似的东西慢慢淡入:

callerNode->schedule(schedule_selector(DerivedA::doSomethingStaticA), 0.05f);

doSomethingStaticA做诸如此类的事情

CocosDenshion::SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(sFadeMusicVolume);

运行时调用doSomethingStaticA发生在CCTimer::update中。

4

1 回答 1

1

您甚至不能用 初始化pCallback&DerivedA::doSomethingStaticA因为指向静态成员函数的指针实际上是指向函数的指针,而不是指向成员函数的指针。

所以有些东西很糟糕,即使只是你的示例代码;-) 也b->pCallback可能应该是b->*pCallbacknew返回一个不能用于初始化的指针,db缺少一些分号,也许还有其他我错过的问题。编写一个简短的程序来编译,发布它,然后问你关于这个程序的问题。

于 2013-04-16T16:13:29.010 回答