能否在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
相关产品推荐
相关产品推荐

