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

如何给指针数组赋值来自自定义类对象的成员函数?

你遇到的这个问题其实是C++里函数指针和类成员函数指针的本质区别导致的,咱们一步步拆解解决:

首先看报错的两个关键点:

  • "use '&' to create a pointer to member":类成员函数的地址必须显式用&获取,不能像普通函数那样直接写函数名,哪怕是通过对象访问也不行,得写成&worker::select。
  • "cannot convert from 'int(_thiscall worker:: )(void)' to 'int(_cdecl )(void)':类的非静态成员函数背后藏着一个你看不见的this指针,这让它的调用约定、类型和普通全局/局部函数完全不兼容,所以没法直接塞进普通函数指针数组里。

下面给你三种针对性的解决方案,按需选择:


方案1:把成员函数改成静态的(最简单的适配方式)

如果你的worker::select不需要访问对象的非静态成员变量,改成静态成员函数就完美解决——静态成员函数没有this指针,类型和普通函数完全一致。

代码示例:

#include <iostream>
using namespace std;

class worker {
public:
    static int select() {  // 标记为静态成员函数
        cout<<"SELECT!";
        getchar();
        return 0; // 补充返回值,和函数指针类型匹配
    }
};

int(*Functions[3])(); // 原普通函数指针数组不变

int main() {
    Functions[0] = &worker::select; // 显式用&取静态成员函数地址
    Functions[0](); // 和调用普通函数完全一样
    return 0;
}

方案2:改用成员函数指针数组(保留非静态成员函数)

如果select必须是非静态的(比如要访问对象的成员变量),那你得把数组改成类成员函数指针数组,让类型完全对应。

代码示例:

#include <iostream>
using namespace std;

class worker {
public:
    int select() {
        cout<<"SELECT!";
        getchar();
        return 0;
    }
};

// 定义worker类的成员函数指针数组,格式:返回值(类名::*数组名[大小])()
int(worker::*Functions[3])(); 

int main() {
    worker object1;
    Functions[0] = &worker::select; // 显式取非静态成员函数地址
    // 调用时必须绑定对象,用.*或->*操作符,括号不能少(优先级问题)
    (object1.*Functions[0])(); 
    // 如果是对象指针:worker* ptr = &object1; (ptr->*Functions[0])();
    return 0;
}

方案3:用std::function包装(现代C++灵活方案)

如果不想改数组的基础类型,还可以用std::function来包装成员函数和对象,它能兼容普通函数、lambda、成员函数等各种可调用对象,灵活性拉满。

代码示例:

#include <iostream>
#include <functional> // 必须包含这个头文件
using namespace std;

class worker {
public:
    int select() {
        cout<<"SELECT!";
        getchar();
        return 0;
    }
};

// 改成std::function数组,类型为int()
std::function<int()> Functions[3];

int main() {
    worker object1;
    // 两种绑定方式选一种就行:
    // 1. 用std::bind绑定对象和成员函数
    Functions[0] = std::bind(&worker::select, &object1); 
    // 2. 用lambda表达式捕获对象
    // Functions[0] = [&object1](){ return object1.select(); };
    
    Functions[0](); // 直接调用,和普通函数一样
    return 0;
}

内容的提问来源于stack exchange,提问作者Artur Szczypta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:39:53