通过循环std :: map调用类方法

时间:2014-10-08 17:56:02

标签: c++ cocos2d-x member-function-pointers

我得到了一个名为CharacterAnimation的类,它由一个虚拟方法组成:

CharacterAnimation : public cocos2d::CCObject {
  public:
  ...
    virtual void start(float td);
}

和几个继承自它的类:

  • CharacterAnimationBlink
  • CharactedAnimationDropTear

我想要的是:

  1. 创建

    std::map<std::string, CharacterAnimation*> animationsList;
    
  2. 填写animationList,如:

    animationsList["blink"] = new CharacterAnimationBlink(1,2,3);
    animationsList["dropTear"] = new CharacterAnimationDropTear(1,2);
    
  3. 循环使用此std :: map

  4. 对于每个std::map元素调用

    this->schedule(schedule_selector(characterAnimationStartMethodPointer), Character::animationPeriod);
    
  5. 应该放置什么而不是currentAnimationStartMethodPointer?如何从start()

    访问指向当前对象的std::map方法的指针

    来自CCObject.h

    typedef void (CCObject::*SEL_SCHEDULE)(float);
    ...
    #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
    

2 个答案:

答案 0 :(得分:1)

假设您不控制schedule()函数的声明,则无法获得指向特定start()实例的CharacterAnimation函数的单个指针。相反,你需要两件事:一个成员函数指针,一个引用或指向应该调用该函数的实例的指针。

如您的问题所示,看起来schedule()需要成员函数指针(特别是CCObject类中的函数)。您的CharacterAnimation类继承自CCObject,但是CharacterAnimation::start()的成员函数指针不是指向CCObject函数的成员函数指针,假设从缺少virtualoverride说明符start()CharacterAnimation中声明,而不是从CCObject继承。

答案 1 :(得分:0)

使用此代码使全局调度程序每start秒调用Character::animationPeriod方法。

for (std::map<std::string, CharacterAnimation*>::iterator i = animationsList.begin();
     i != animationsList.end();
     ++i)
{
    CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CharacterAnimation::start),
                                                                   i->second,
                                                                   Character::animationPeriod,
                                                                   false);
}