2012-08-24 113 views
2

我遇到了以下問題。我有一個類:使用指向類方法的指針作爲函數的參數,但作爲函數指針,而不是指向方法的指針

class My_Class 
{ 
    public: 
    My_Class(void); // constructor 
    double * Return_Values(double x, double y); // returns a pointer to the array 
} 

我也有,我想其他類(需要出於某種原因),以確保從My_Class類完全獨立的,但有一個需要類似My_Class::Return_Values(double x, double y)的功能的方法。所以我決定嘗試通過一個函數指針:

class Independent_Class 
{ 
    public: 
    Independent_Class(); // constructor 
    void Crazy_Method(int a, int b, double * (*FunctionToOperate)(double,double)); 
} 

現在我在代碼的主體如下:

double * (My_Class::*pt2Member)(double,double) = NULL;     
pt2Member = &My_Class::Return_Values; 
Fields = (My_Class_instance.*pt2Member)(0.0,0.0); // this works perfectly 

現在我試圖欺騙一個位(是的,我知道函數指針與指向類成員的指針不一樣,但我仍試過)。

double * (*func)(double,double); 
func=pt2Member;  // Doesn't work 
Independent_Class_instance.Crazy_Method(1,1, &(My_Class_instance.*pt2Member)) //Doesn't work 

所以這個想法沒有奏效。哪裏不對?我能以某種方式做我想做的事嗎(讓這些類獨立)?

回答

4

您需要將指針綁定到該對象。我建議使用std::functionstd::bind。這將導致更清潔的代碼,除非由於某種原因,你絕對必須使用原始函數指針。

下面是一個例子。這是關閉內存,所以它可能不完全正確,但它確實告訴你std::function是多麼簡單的事情。請注意,這已添加到C++ 11中的標準庫中。如果你有一個非常老的編譯器(甚至GCC 4.4支持功能),你將需要使用Boost。在這種情況下,請將下面的所有std s替換爲boost s。

#include <functional> 

class Independent_Class 
{ 
    public: 
    Independent_Class(); // constructor 
    void Crazy_Method(int a, int b, std::function<double* (double,double)> FunctionToOperate); 
} 


std::function<double* (double, double)> func; 
func = std::bind(&My_Class::Return_Values, My_Class_instance, _1, _2); 
Independent_Class_instance.Crazy_Method(1,1,func); 
+0

+1使用功能。 – Anthony

+0

在我的Mac上不起作用。我安裝了gcc-46,#include 完美地工作,但後來在std :: function引發了錯誤:std沒有成員函數。我需要安裝其他東西嗎?似乎對我來說不是一個好的解決方案,因爲我希望代碼儘可能通用,並且儘可能獨立於外部庫 – Sleepyhead

+0

@user您還必須啓用「-std = C++ 0x」編譯器選項。 – Antimony

2

甲類的方法使用表示指針到正在調用該方法的對象的隱式參數。即,該方法

void MyClass::foo(int, int); 

實際上

void foo(MyClass*, int, int) 

這種轉換的編譯器無縫地發生,但你可以經常看到一個調試器的作用是。畢竟,這就是this指針的存在方式。

因爲該方法隱含地期待表示對象的指針參數,所以不能只使用常規函數指針。