我有两个类,其中一个(类ode)有一个私有成员,它是一个函数(指向函数的指针):
class ode
{
private:
double T;
double (*sfn)(double,double,double*);//I mean this
int Ne;
public:
ode(double t,double (*f)(double,double,double*),int N)
{
Ne=N;
T=t;
sfn=f;
} //.....
}
现在我想构建一个ode对象,在它的构造中,函数(sfn)应该从另一个类获取!!如果我想使用一个超出任何类的函数,我应该只在构造函数中写出该函数的名称。但这种情况是不同的。 我能做什么??我怎么能构造这个对象??
答案 0 :(得分:0)
能够调用成员函数需要指向类的指针。
class X {
...
double fn( double,double,double*);
};
为了能够获得指向成员的指针,你需要一个这样的想法。
X * pMember; // hold instance we want to call.
typedef double (X::*funcPointer)( double, double, double * );
funcPointer fPtr = X::fn;
然后最终可以用
调用(pMember->*fPtr)( v1,v2,&v3);
在所有情况下,都需要知道X类。
使用此模式的原因是,当存在多个共享签名的函数时,这些函数由于不同的原因而被使用。 UI系统(MFC,wxWidgets)使用此技术将窗口事件绑定到处理函数。
或者,使用多重继承,其中函数定义良好,但实现的实现方式不同。
class base {
virtual double func( double, double, double * ) = 0;
};
class X1 : public base {
double func( double, double, double * )
{
// implementation.
}
};
class X2 : public base {
double func( double, double, double * )
{
// implementation.
}
};
每个实现X1,X2,...提供适合虚拟绑定的已更改行为。
这只需要一个成员基础;
base * pBase;
pBase->func( v1, v2, &v3);