请问究竟怎样才能通过指针调用类成员函数啊?

时间:2021-07-08 19:06:23
举个简单的例子(请先不要关心程序是否有必要这么做):
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); 

#5


引用 3 楼 steedhorse 的回复:
这个应该是正确的: 

C/C++ codeclass 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 …



学习。
这种方法可用于通过指针去调用类的各种具有相同形参的函数。

#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的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.

#8


类的成员函数指针与一般还是指针是不一样的,必须指定成员函数的作用域(CLASSA::)

#9


引用 7 楼 aquaman 的回复:
谢谢!这个虽然可行,但不是我想要的那种.怪我没有说清楚,不好意思.在我原来的程序中,有一个积分器的类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函数传到这里来积…


为什么一定要把函数指针传进来呢?直接传对象指针,然后通过 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); 

#5


引用 3 楼 steedhorse 的回复:
这个应该是正确的: 

C/C++ codeclass 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 …



学习。
这种方法可用于通过指针去调用类的各种具有相同形参的函数。

#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的形式改了,那积分器也要作相应修改.要是能不动积分器就好了.

#8


类的成员函数指针与一般还是指针是不一样的,必须指定成员函数的作用域(CLASSA::)

#9


引用 7 楼 aquaman 的回复:
谢谢!这个虽然可行,但不是我想要的那种.怪我没有说清楚,不好意思.在我原来的程序中,有一个积分器的类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函数传到这里来积…


为什么一定要把函数指针传进来呢?直接传对象指针,然后通过 obj->func() 来调用不是也可以么?

不过你说如果model的形式变了,要保持integrate不变似乎不太可能吧,如果model的形参变了,要在integrate里面调用这个函数,实参应该还是要跟着变得吧!