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

能否在C类中存储A类成员函数指针列表并通过B类对象调用?

解决方案

首先,先解决你当前代码里的成员函数指针调用语法问题:

成员函数指针的调用必须使用 对象.*成员函数指针 或 对象指针->*成员函数指针 的语法,而且由于运算符优先级问题,必须给整个表达式加括号。同时你原来的代码还存在两处小问题:C类里缺少objectB成员声明,fncList初始化时A::setter2漏了取地址符&。修正后的完整代码如下:

#include <list>

class A
{
public:
    void setter1(int whatever)
    {
        // set Something ...
    }
    
    void setter2(int whatever)
    {
        // set Something ...
    }
    
    void setter3(int whatever)
    {
        // set Something ...
    }
};

class B
{
public:
    A objectA;
};
    
class C
{
public:
    B objectB; // 补充缺失的成员声明
    std::list<void (A::*)(int)> fncList = {&A::setter1, &A::setter2, &A::setter3}; // 修正取地址符问题

    C()
    {
        // 调整循环逻辑,避免无限调用
        while (!fncList.empty())
        {
            someFunc();
        }
    }
    
    void someFunc()
    {
        auto setterFnc = fncList.front();
        fncList.pop_front();
        // 正确调用语法:括号不能省略
        (objectB.objectA.*setterFnc)(100); // 传入示例int参数
    } 
};

如果你想要更简洁直观的调用方式,可以改用std::function封装绑定好对象的成员函数,彻底避开成员函数指针的特殊语法:

#include <functional>
#include <list>

// A、B类定义同上

class C
{
public:
    B objectB;
    std::list<std::function<void(int)>> fncList;

    C()
    {
        // 将对象和成员函数绑定成可直接调用的对象
        fncList.push_back(std::bind(&A::setter1, &objectB.objectA, std::placeholders::_1));
        fncList.push_back(std::bind(&A::setter2, &objectB.objectA, std::placeholders::_1));
        fncList.push_back(std::bind(&A::setter3, &objectB.objectA, std::placeholders::_1));

        for (auto& fnc : fncList)
        {
            fnc(200); // 直接调用,无需处理成员指针语法
        }
    }
};

如果使用C++11及以上版本,推荐用lambda表达式替代std::bind,可读性更强:

// A、B类定义同上

class C
{
public:
    B objectB;
    std::list<std::function<void(int)>> fncList;

    C()
    {
        // 用lambda直接捕获this,明确指定调用逻辑
        fncList.push_back([this](int val) { objectB.objectA.setter1(val); });
        fncList.push_back([this](int val) { objectB.objectA.setter2(val); });
        fncList.push_back([this](int val) { objectB.objectA.setter3(val); });

        for (auto& fnc : fncList)
        {
            fnc(300);
        }
    }
};

这种lambda写法不需要依赖占位符,逻辑清晰,适合大多数场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:29