当前类的成员函数的指针数组

Posted

技术标签:

【中文标题】当前类的成员函数的指针数组【英文标题】:Array of Pointers on Member functions of current class 【发布时间】:2017-04-04 11:26:16 【问题描述】:

我尝试创建当前类的成员函数指针数组,但目前没有成功...

我已经尝试了很多东西,这是我的代码:

// Human.hpp

#include <iostream>

class Human

    private:
        void meleeAttack(std::string const & target);
        void rangedAttack(std::string const & target);
        void intimidatingShout(std::string const & target);
    public:
        void action(std::string const & action_name, std::string const & target);
;
// Human.cpp

#include "Human.hpp"

// ...

void    Human::action(std::string const & action_name, std::string const & target)

    std::string actionsStr[] = "meleeAttack", "rangedAttack", "intimidatingShout";

    typedef void (Human::*Actions)(std::string const & target);
    Actions actions[3] = &Human::meleeAttack, &Human::rangedAttack, &Human::intimidatingShout;

    for (int i = 2; i >= 0; i--)
        if (actionsStr[i] == action_name)
        
            actions[i](target); // there is an error HERE
            break;
        

此代码在编译时产生错误:

main.cpp:41:23: error: called object type 'Actions' (aka 'void (Human::*)(const std::string &)') is not a function or function pointer
            actions[i](target);
            ~~~~~~~~~~^
1 error generated.

有什么好的方法吗?

【问题讨论】:

指向非成员函数的指针和指向成员函数的指针是不一样的。指向成员函数的指针需要调用一个 object (成为this 指针)。您可能想了解std::functionstd::bind 您可能还想了解std::unordered_map C++ Call Pointer To Member Function的可能重复 【参考方案1】:
for (int i = 2; i >= 0; i--)
    if (actionsStr[i] == action_name)
    
        (this->*(actions[i]))(target);
        break;
    

【讨论】:

为什么会这样? 因为语言规则

以上是关于当前类的成员函数的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

如何复制动态分配的对象(具有一个类的 const 成员)

类的成员函数this指针

c++类的成员函数指针如何转为普通指针

C++中怎么获取类的成员函数的函数指针

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

如何获得指向类的复制构造函数的成员函数指针?