2014-01-16 167 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 
    } 
};