如何初始化存储运算符重载成员函数指针的std::vector?
解决Fractal类成员运算符函数指针存入std::vector的问题
嘿,我看到你在尝试把Fractal类的运算符重载成员函数指针存入vector时遇到了问题,这其实是因为你混淆了普通函数指针和类成员函数指针的核心区别——类的成员函数会隐含一个this指针参数,所以它们的类型和普通函数完全不一样。咱们一步步来修正你的代码:
问题根源
你原来定义的typedef Fractal(*fractalOperator)(Fractal, Fractal);是普通函数指针,但你的operator+/-/*/都是Fractal类的成员函数,它们的实际签名是Fractal (Fractal::*)(Fractal)(第一个隐含参数是指向Fractal实例的this指针),所以普通函数指针根本无法指向这些成员函数。
正确的类型定义
首先,你需要定义类成员函数指针的类型,有两种写法:
// 传统typedef写法 typedef Fractal (Fractal::*FractalOperator)(Fractal); // C++11及以后更推荐的using写法(可读性更好) using FractalOperator = Fractal (Fractal::*)(Fractal);
初始化std::vector
接下来,你可以用成员函数的地址来初始化vector,注意要使用&Fractal::operator+这种语法来获取成员函数的地址:
#include <vector> struct Fractal { int dividee; int divisor; Fractal operator+(Fractal other) { // 示例实现,可替换为你的逻辑 return {dividee + other.dividee, divisor + other.divisor}; } Fractal operator-(Fractal other) { return {dividee - other.dividee, divisor - other.divisor}; } Fractal operator*(Fractal other) { return {dividee * other.dividee, divisor * other.divisor}; } Fractal operator/(Fractal other) { // 注意处理除零,这里仅做示例 return {dividee / other.dividee, divisor / other.divisor}; } }; int main() { Fractal fractal = {3, 10}; using FractalOperator = Fractal (Fractal::*)(Fractal); std::vector<FractalOperator> ops = { &Fractal::operator+, &Fractal::operator-, &Fractal::operator*, &Fractal::operator/ }; // 示例:调用vector中的第一个运算符(+) Fractal another = {2, 5}; Fractal result = (fractal.*ops[0])(another); return 0; }
调用成员函数指针的注意事项
调用成员函数指针时,必须使用.*(针对对象实例)或->*(针对对象指针)运算符,而且需要加括号保证优先级正确:
// 如果是对象指针 Fractal* ptr = &fractal; Fractal result2 = (ptr->*ops[1])(another); // 调用减法运算符
如果你希望避免成员函数指针的复杂性,也可以考虑用std::function包装这些运算符,这样写法更灵活:
#include <functional> // 用std::function包装 std::vector<std::function<Fractal(Fractal, Fractal)>> ops_func = { [](Fractal a, Fractal b) { return a + b; }, [](Fractal a, Fractal b) { return a - b; }, [](Fractal a, Fractal b) { return a * b; }, [](Fractal a, Fractal b) { return a / b; } }; // 调用更直观 Fractal result3 = ops_func[2](fractal, another); // 调用乘法运算符
内容的提问来源于stack exchange,提问作者dukc
相关产品推荐
相关产品推荐

