c++ - 如何将类的方法传递给 C++ 中的另一个函数?

标签 c++ class function methods

假设我有一个类和一个函数

class A
{
    int a;
    int b;
    int mul()
    {
        return a+b;
    }
};
...

void func(int af, int bf, int (*fc)())
{
    ...
}

在main函数中,该函数应该使用类A的方法

int main
{
    A as;
    ...
    func(as.a, as.b, as.mul);
}

但是,我不能那样做,编译器一直告诉我我正在通过

(int&, int&, 'unresolved overloaded function type') 

进入候选函数

(int, int, void(*)()).

为什么会这样,如何将一个类的方法传递给另一个函数?

哦,我想我应该把问题弄清楚一点。 func(...) 实际上是我正在研究的算法的一个函数。 class A 是将使用该算法进行模拟的模型。所以我不认为我会在函数 B 中专门使用 A 的实例,而只是将 A 的方法和组件传入并使用它们。


更新:有人提到在类 A 中使用静态方法。但是,这仍然是部分解决方案。使用静态方法 mul() 将迫使我声明 a 和 b 都是静态的。如果我必须使用 A 的多个实例,并且在我的主函数中每个实例的方法 a、b 都不同,那么使用静态变量将完全失败。

那么,关于如何在不使用静态变量/方法的情况下解决这个问题,还有其他建议吗?我记得在 python 等脚本语言中,传递任何类型的方法基本上都不是问题。为什么我不能在 C++ 中做类似的事情?或者 C++ 中是否有可以帮助我做到这一点的解决方法?

最佳答案

首先,mulA成员函数,所以不能像调用全局函数一样调用它或 static 成员函数:它需要一个调用该函数的对象:

A::mul(); // ERROR!
A a;
a.mul(); // OK

也就是说,您可以更改 func 的定义以接受指向成员函数的指针:

void func(int af, int bf, void (A::*fc)())
//                        ^^^^^^^^^^^^^^^

但是,这个改变单独不会让你进步太多,因为你仍然没有传递成员函数应该在其上的 A 的具体实例调用。换句话说,这是非法的:

fc(); // ERROR!

要克服此限制,您可以将指向 A 实例的引用或指针一起传递给 func,并按如下方式调用它:

void func(A* pA, int af, int bf, void (A::*fc)())
{
    ...
    (pA->*func)();
}

但是,如果 func() 将调用成员函数的对象作为参数传入,则不清楚 af 的目的是什么和 bf

可能,如果您的 mul() 成员函数不需要在 A 的任何具体实例上工作,而您仍然想让它成为 的成员>A,您可以将其声明为static:

class A
{
    int a;
    int b;
    static void mul();
//  ^^^^^^
};

这将使您对 func() 的原始调用编译。然而,在这种情况下,不清楚这是否有意义,因为 mul() 不接受任何参数的事实表明它应该在 ab 调用它的对象的成员。

关于c++ - 如何将类的方法传递给 C++ 中的另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688626/

相关文章:

c++ - 当我调用工作簿的 PrintPreview() 方法时出现 Com 错误 800a03ec

c++ - 如何在 gcc 中声明和定义一个纯函数?

c++ - 无法在 VS Code 上使用代码运行器运行 C++ 文件

c++ - 当应用于命名空间范围内的类时,静态意味着什么?

Java继承,遍历每个子类

包含宏的 C++ 方法声明

python - 如何在 python 中检查指定函数的至少一个默认参数

python - Python中的函数和C++中的函数有什么区别?

MYSQL 函数/过程

C++ 指向函数的指针