2014-01-16 117 views
0

基本上我想要的是将成员函数的引用传递给另一个类的另一个函数。示例代码是这样的:指向一个类的成员函数的指针

#include<iostream> 

using namespace std; 

class algorithm 
{ 
    void (*ODE)(double * timeDeri, double * var); 
    void simulation() 
    { 
     //use ODE to do simulation 
    } 
    parent(void (*someODE)(double * timeDeri, double * var)) 
    { 
     ODE=someODE; 
    } 
} 

class model:algorithm 
{ 
    void specificODE(double * timeDeri, double * var) 
    { 
     //detail of the ODE 
    } 
    model() : algorithm(specificODE) 
    { 
     //some initialization 
    } 
} 

int main() 
{ 
    model a; 
    a.simulation(); 
} 

现在我知道这段代码不起作用。因为函数指针只能用于指向静态函数。但是,出于某些实际原因,我无法使specificODE保持静态。所以我不知道是否有一种指针可以帮助我做到这一点。谁能帮忙?

PS1,我检查过成员函数指针。如果我想要的是指向同一个类中的成员函数,那么该指针非常有用。但是在这种情况下,指针应该能够指向不同类的成员函数。

PS2,定义基于模型的算法类是一种工作。但是,我想让模型和算法相互独立。所以,如果我在另一个模型上使用相同的算法,我不必在我的算法类中弄乱代码。出于同样的原因,我不想和模型类和算法类交朋友,也不想为算法类中的模型类做任何事情。

回答

1

成员函数的正确语法是

void (algorithm::*ODE)(double * timeDeri, double * var) 

至于你提到,你实际上需要的是通用和使用:

void (T::*ODE)(double * timeDeri, double * var) 

所以您可以使用CRTP为:

template <typename T> 
class algorithm 
{ 
public: 
    // You may use typedef: 
    // typedef void (T::*ODE_T)(double * timeDeri, double * var); 
    // ODE_T ODE; 

    void (T::*ODE)(double * timeDeri, double * var); 

    void simulation() 
    { 
     double d1, d2; 

     (static_cast<T*>(this)->*ODE)(&d1, &d2); 
     //use ODE to do simulation 
    } 

    //explicit algorithm(ODE_T someODE) 
    explicit algorithm(void (T::*someODE)(double * timeDeri, double * var)) 
    { 
     ODE = someODE; 
    } 
}; 

class model : private algorithm<model> 
{ 
    friend algorithm<model>; // As you inherit privately from algorithm<T>. 
public: 
    void specificODE(double * timeDeri, double * var) 
    { 
     //detail of the ODE 
    } 
    model() : algorithm(&model::specificODE) 
    { 
     //some initialization 
    } 
};