假设我有一个类和一个函数
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++ 中是否有可以帮助我做到这一点的解决方法?
最佳答案
首先,mul
是A
的成员函数,所以不能像调用全局函数一样调用它或 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()
不接受任何参数的事实表明它应该在 a
和b
调用它的对象的成员。
关于c++ - 如何将类的方法传递给 C++ 中的另一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688626/