|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2005-6-2 13:07
|
显示全部楼层
//问题的实质是如何调用class member形式的function pointer。下面的例子把自定义函数简化了。
//假设有一堆函数 f1(x), f2(x), f3(x),想计算一组采样点的sum,用OOP的话自然而然写成一个class:
class CBasisFunction
{
private:
int m_nType;
typedef double (CBasisFunction::*PFUNCTION)(double);
double f1(double x) { return x; }
double f2(double x) { return x*x; }
double f3(double x) { return 1/x; }
public:
PFUNCTION pBF;
CBasisFunction(void){
m_nType = 0;
};
void SetBasisFunction (int nType) {
m_nType = nType;
switch(m_nType){
case 0:
pBF = &CBasisFunction::f1;
break;
case 1:
pBF = &CBasisFunction::f2;
break;
case 2:
pBF = &CBasisFunction::f3;
break;
}
}
};
//使用这个类的时候,代码只能写成
#include <stdio.h>
int main()
{
CBasisFunction BF;
double x, sum=0;
BF.SetBasisFunction(1);
for (x=0; x<1; x+=0.01){
sum+=(BF.*BF.pBF)(x); //调用类成员形式的函数指针
}
printf("%lf\n", sum);
return 0;
}
// OOP的目标是让代码容易理解和维护,可这里却让人费解。不知道有没有更好的方法?
// 写完这个类和积分算法类(梯形、simpson)后就再也没有维护过,反正用起来省事。。。
// 积分类的调用也比较夸张
// CBasisFunction BF;
// CIntegrateImpl<CBasisFunction> *itg = new CIntegrateImpl<CBasisFunction>(&BF, BF.pBF);
// BF.SetBasisFunction(1);
// itg->Integrate(a,b); |
|