class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
double square(double (*Model)(double t), double x)
{
double b=Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
double result=square(test.Model, 1.0);
}
这个程序编译(VC6.0)会报错:cannot convert parameter 1 from 'double (double)' to '
double (__cdecl *)(double)'.我知道把类中的Model弄成静态的,同时私有数据成员k也弄
成静态的就可以.但是我原来的程序比这个复杂,Model几乎调用了所有的数据成员和函数成
员,那势必都要弄成静态的了,这又是我不希望的.哪位能告诉我具体怎么做么?真的非常感谢
.网上搜到相关问题也看不出个所以然,主要是自己比较菜,学C++才几个月.
9 个解决方案
#1
使用指向成员函数的指针。
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
double square(Test& t, double (Test::*Model)(double t), double x)
{
double b=t.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
double result=square(test, &Test::Model, 1.0);
}
#2
不对不对,写错了,稍等一下。
#3
这个应该是正确的:
class Test
{
public:
Test(){k=0;}
explicit Test(double a) { k = a; }
double Model(double t) { return k * t; }
private:
double k;
};
double square(Test& t, double (Test::*pf)(double t), double x)
{
double b = (t.*pf)(x);
return b * b + x * x;
}
void main()
{
Test test(1.0);
double result=square(test, &Test::Model, 1.0);
}
#4
把类对象当成参数传递就行了
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
//double square(double (*Model)(double t), double x)
double square(Test& tmp, double x)
{
// double b=Model(x);
double b= tmp.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
// double result=square(test.Model, 1.0);
double result = square(test, 1.0);
}
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
//double square(double (*Model)(double t), double x)
double square(Test& tmp, double x)
{
// double b=Model(x);
double b= tmp.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
// double result=square(test.Model, 1.0);
double result = square(test, 1.0);
}
#5
学习。
这种方法可用于通过指针去调用类的各种具有相同形参的函数。
#6
学习了
#7
谢谢!这个虽然可行,但不是我想要的那种.怪我没有说清楚,不好意思.在我原来的程序中,有一个积分器的类RungeKuttaF
void RungeKuttaF::Integrate(void (*Model)(double t, const MyVec &y, MyVec &yp),
MyVec &y, double &t, const double &tout, const MyVec abserr, int &iflag,
const double relerr, int maxnfe)
我是想把某个类中的Model函数传到这里来积分.如果把Model的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.
void RungeKuttaF::Integrate(void (*Model)(double t, const MyVec &y, MyVec &yp),
MyVec &y, double &t, const double &tout, const MyVec abserr, int &iflag,
const double relerr, int maxnfe)
我是想把某个类中的Model函数传到这里来积分.如果把Model的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.
#8
类的成员函数指针与一般还是指针是不一样的,必须指定成员函数的作用域(CLASSA::)
#9
为什么一定要把函数指针传进来呢?直接传对象指针,然后通过 obj->func() 来调用不是也可以么?
不过你说如果model的形式变了,要保持integrate不变似乎不太可能吧,如果model的形参变了,要在integrate里面调用这个函数,实参应该还是要跟着变得吧!
#1
使用指向成员函数的指针。
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
double square(Test& t, double (Test::*Model)(double t), double x)
{
double b=t.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
double result=square(test, &Test::Model, 1.0);
}
#2
不对不对,写错了,稍等一下。
#3
这个应该是正确的:
class Test
{
public:
Test(){k=0;}
explicit Test(double a) { k = a; }
double Model(double t) { return k * t; }
private:
double k;
};
double square(Test& t, double (Test::*pf)(double t), double x)
{
double b = (t.*pf)(x);
return b * b + x * x;
}
void main()
{
Test test(1.0);
double result=square(test, &Test::Model, 1.0);
}
#4
把类对象当成参数传递就行了
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
//double square(double (*Model)(double t), double x)
double square(Test& tmp, double x)
{
// double b=Model(x);
double b= tmp.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
// double result=square(test.Model, 1.0);
double result = square(test, 1.0);
}
class Test
{
public:
Test(){k=0;}
explicit Test(double a){k=a;}
double Model(double t){return k*t;}
private:
double k;
};
//double square(double (*Model)(double t), double x)
double square(Test& tmp, double x)
{
// double b=Model(x);
double b= tmp.Model(x);
return b*b+x*x;
}
void main()
{
Test test(1.0);
// double result=square(test.Model, 1.0);
double result = square(test, 1.0);
}
#5
学习。
这种方法可用于通过指针去调用类的各种具有相同形参的函数。
#6
学习了
#7
谢谢!这个虽然可行,但不是我想要的那种.怪我没有说清楚,不好意思.在我原来的程序中,有一个积分器的类RungeKuttaF
void RungeKuttaF::Integrate(void (*Model)(double t, const MyVec &y, MyVec &yp),
MyVec &y, double &t, const double &tout, const MyVec abserr, int &iflag,
const double relerr, int maxnfe)
我是想把某个类中的Model函数传到这里来积分.如果把Model的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.
void RungeKuttaF::Integrate(void (*Model)(double t, const MyVec &y, MyVec &yp),
MyVec &y, double &t, const double &tout, const MyVec abserr, int &iflag,
const double relerr, int maxnfe)
我是想把某个类中的Model函数传到这里来积分.如果把Model的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.
#8
类的成员函数指针与一般还是指针是不一样的,必须指定成员函数的作用域(CLASSA::)
#9
为什么一定要把函数指针传进来呢?直接传对象指针,然后通过 obj->func() 来调用不是也可以么?
不过你说如果model的形式变了,要保持integrate不变似乎不太可能吧,如果model的形参变了,要在integrate里面调用这个函数,实参应该还是要跟着变得吧!