You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何通过字符串调用类内的成员函数?

报错根本原因

你定义的void (*pFunc)()是无入参普通函数指针类型,但类的非静态成员函数包含隐式的this指针入参,两者类型不匹配,因此无法直接赋值。

可行实现方案

方案1:成员函数改为静态成员

静态成员函数无隐式this指针,和普通函数指针类型兼容,改动最小:

#include <map>
#include <string>
#include <iostream>

using namespace std;

class theClass {
public:
    typedef void (*pFunc)();
    map<string, pFunc> strFuncMap;

    // 改为静态成员函数
    static void func1()
    {
        printf("this is func1!\n");
    }

    void buildMap()
    {
        strFuncMap["func1"] = &func1;
    }

    void callFunc(const std::string& str)
    {
        (*strFuncMap[str])();
    }
};


int main()
{
    theClass a;
    a.buildMap();

    a.callFunc("func1");
    return 0;
}

适用场景:函数不需要访问类的非静态成员。

方案2:使用类成员函数指针

如果函数必须访问类的非静态成员,可以直接声明类成员函数指针类型,调用时绑定类实例:

#include <map>
#include <string>
#include <iostream>

using namespace std;

class theClass {
public:
    // 声明类成员函数指针类型
    typedef void (theClass::*pFunc)();
    map<string, pFunc> strFuncMap;

    void func1()
    {
        printf("this is func1!\n");
    }

    void buildMap()
    {
        strFuncMap["func1"] = &theClass::func1;
    }

    void callFunc(const std::string& str)
    {
        // 绑定当前实例调用成员函数
        (this->*strFuncMap[str])();
    }
};


int main()
{
    theClass a;
    a.buildMap();

    a.callFunc("func1");
    return 0;
}

适用场景:仅需要调用当前类的非静态成员函数,不需要兼容其他类型函数。

方案3:使用C++11 std::function + std::bind(推荐)

这种方案灵活性最高,兼容静态函数、非静态成员函数、lambda等多种可调用对象,后续扩展成本低:

#include <map>
#include <string>
#include <iostream>
#include <functional> // 新增头文件

using namespace std;

class theClass {
public:
    // 用std::function做值类型
    map<string, function<void()>> strFuncMap;

    void func1()
    {
        printf("this is func1!\n");
    }

    void buildMap()
    {
        // 绑定当前实例到成员函数
        strFuncMap["func1"] = bind(&theClass::func1, this);
    }

    void callFunc(const std::string& str)
    {
        // 直接调用即可
        strFuncMap[str]();
    }
};


int main()
{
    theClass a;
    a.buildMap();

    a.callFunc("func1");
    return 0;
}

内容的提问来源于stack exchange,提问作者Yichao Sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:12:04