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

如何初始化存储运算符重载成员函数指针的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:20