gpt4 book ai didi

C++:在不同类的派生对象的基指针上调用静态成员函数

转载 作者:行者123 更新时间:2023-11-28 07:39:58 24 4
gpt4 key购买 nike

编辑:下面的例子像想象的那样工作。对于这个问题,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模式下)没问题,但我想知道这是否不好 (TM) - 为什么? (我尚未使用适用于 Android 和 iOS 的编译器测试此代码)。

如果需要,可以提供更多细节:我正在构建一个 cocos2d-x基于项目。 BaseCCObject , DerivedADerivedBCCLayer 的子类.

层次结构是 DerivedADerivedB < 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 中.

最佳答案

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

所以有些东西是坏的,即使只是你的示例代码;-) 另外 b->pCallback 可能应该是 b->*pCallback, new 返回一个不能用于初始化 db 的指针,缺少一些分号,也许还有其他我遗漏的问题。编写一个简短的程序来编译、发布它并提出有关该程序的问题。

关于C++:在不同类的派生对象的基指针上调用静态成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com