Class 中方法的函数指针数组
Function Pointer Array to a Method within a Class
我有一个 class say 方法,它具有多个函数,用于使用类似于下面的加、减、乘...函数的不同方法来求解 PDE。 class 中的另一个函数(本例中的 DoMath)调用这些方法。用户可以更改方法类型(加、减、...),所以我想创建一个方法指针数组(method_pointer),其中通过选择整数 "method_type" 来选择方法。我有一个 C 版本,其中所有内容都在一个文件中,而不是 class 的成员,这工作正常;但是,当指针是 class 的成员时,我会收到 "Method_pointer is not a function or function pointer" 错误。我无法获得正确的语法,将不胜感激任何帮助。下面是我正在尝试做的示例程序。
Method.h Header
class Method{
public:
Method();
~Method();
void add(int, int, int);
void subtract(int, int, int);
void multiply(int, int, int);
void divide(int, int, int);
void DoMath(int, int, int);
void set_method( const int method_number);
private:
int method_type;
};
Method.cc 来源
#include "method.h"
typedef void (*method_function)(int, int,int);
Method::Method(){
method_type=2;
}
Method::~Method(){
}
void Method::set_method( int method_number){
method_type=method_number;
}
void Method::add( int a, int b, int c){
c=a+b;
}
void Method::subtract( int a, int b, int c){
c=a+b;
}
void Method::multiply( int a, int b, int c){
c=a+b;
}
void Method::divide( int a, int b, int c){
c=a+b;
}
void Method::DoMath(int x, int y, int result){
method_function method_pointer[4]={add,subtract, multiply,divide};
result=method_pointer[method_type](x,y);
}
main.cc
int main(int argc, const char * argv[]) {
Method *method;
int x=2;
int y=3;
int result=0;
Method.DoMath(x,y,result);
return 0;
}
指向方法的指针与指向函数的指针稍有不同。因此,要声明一个,您可以这样写:
typedef void (Method::*method_function)(int, int,int);
并且您必须指定要为其调用此方法的对象:
method_function method_pointer[4] = {&Method::add, &Method::subtract, &Method::multiply, &Method::divide};
method_function func = method_pointer[method_type];
result = (this->*func)(x,y);
但是,如果您要进行设计,请不要忘记将函数的第三个参数设为引用。否则,您将无法提取结果。因此,正确的 typedef 应该是:
typedef void (Method::*method_function)(int, int,int&);
并且您必须相应地更改您的方法签名。
最后,为什么要在主函数中使用指针?您可能应该使用堆栈变量(或至少初始化指针),如果这样做,您需要在对象上调用 DoMath 而不是 class:
Method method;
// ...
method.DoMath(x, y, result);
我有一个 class say 方法,它具有多个函数,用于使用类似于下面的加、减、乘...函数的不同方法来求解 PDE。 class 中的另一个函数(本例中的 DoMath)调用这些方法。用户可以更改方法类型(加、减、...),所以我想创建一个方法指针数组(method_pointer),其中通过选择整数 "method_type" 来选择方法。我有一个 C 版本,其中所有内容都在一个文件中,而不是 class 的成员,这工作正常;但是,当指针是 class 的成员时,我会收到 "Method_pointer is not a function or function pointer" 错误。我无法获得正确的语法,将不胜感激任何帮助。下面是我正在尝试做的示例程序。
Method.h Header
class Method{
public:
Method();
~Method();
void add(int, int, int);
void subtract(int, int, int);
void multiply(int, int, int);
void divide(int, int, int);
void DoMath(int, int, int);
void set_method( const int method_number);
private:
int method_type;
};
Method.cc 来源
#include "method.h"
typedef void (*method_function)(int, int,int);
Method::Method(){
method_type=2;
}
Method::~Method(){
}
void Method::set_method( int method_number){
method_type=method_number;
}
void Method::add( int a, int b, int c){
c=a+b;
}
void Method::subtract( int a, int b, int c){
c=a+b;
}
void Method::multiply( int a, int b, int c){
c=a+b;
}
void Method::divide( int a, int b, int c){
c=a+b;
}
void Method::DoMath(int x, int y, int result){
method_function method_pointer[4]={add,subtract, multiply,divide};
result=method_pointer[method_type](x,y);
}
main.cc
int main(int argc, const char * argv[]) {
Method *method;
int x=2;
int y=3;
int result=0;
Method.DoMath(x,y,result);
return 0;
}
指向方法的指针与指向函数的指针稍有不同。因此,要声明一个,您可以这样写:
typedef void (Method::*method_function)(int, int,int);
并且您必须指定要为其调用此方法的对象:
method_function method_pointer[4] = {&Method::add, &Method::subtract, &Method::multiply, &Method::divide};
method_function func = method_pointer[method_type];
result = (this->*func)(x,y);
但是,如果您要进行设计,请不要忘记将函数的第三个参数设为引用。否则,您将无法提取结果。因此,正确的 typedef 应该是:
typedef void (Method::*method_function)(int, int,int&);
并且您必须相应地更改您的方法签名。
最后,为什么要在主函数中使用指针?您可能应该使用堆栈变量(或至少初始化指针),如果这样做,您需要在对象上调用 DoMath 而不是 class:
Method method;
// ...
method.DoMath(x, y, result);