2013-12-16 103 views
3

我想用函數指針初始化一個結構,但是我這樣做很麻煩,除非它是用全局函數完成的。下面的代碼工作:C++:初始化結構和設置函數指針

float tester(float v){ 
    return 2.0f*v; 
} 

struct MyClass::Example{ 
    typedef float(*MyFunc)(float); 

    MyFunc NameOfFunc; 

    float DoSomething(float a){ 
     return NameOfFunc(a); 
    } 
}; 

struct Example e; 
e.MyFunc = tester; 

我的問題是,每當我嘗試用tester功能爲MyClass函數的代碼將不再有效做到這一點。換句話說,我將測試儀功能更改爲:

float MyClass::tester(float v){ 
    return 2.0f*v; 
} 

任何和所有幫助表示讚賞(包括鏈接)!我曾嘗試谷歌上搜索周圍的問題,但我不確定要搜索什麼(我試過的東西,如「類C++結構函數指針初始化」無濟於事)

+2

需要 「C++成員函數指針」。順便說一句,成員函數需要上下文(object是'this'),所以它不能像普通函數一樣使用。 –

+0

由於'MyClass :: tester'似乎不依賴於任何'MyClass'的非靜態成員,也許你希望它成爲'static'或者只是一個自由函數,就像以前一樣? (然後這段代碼會起作用) –

回答

4

這是因爲當您將該功能作爲班級的成員時,它將不再是float (*)(float)類型,而是float (MyClass::*)(float)

查看std::functionstd::mem_fn來解決這些問題。

實施例:

struct foo { 
    float bar(int x, int y) {} 
}; 

// This works 
std::function<float(int, int)> func = std::mem_fn(&foo::bar); 
+0

我已經嘗試過在某種程度上做了什麼,但是發佈了後續問題,因爲這導致了更多的問題 –

2

如果你想NameOfFunc指向float MyClass::tester(float v)那麼Myfunc聲明必須是,

typedef float (MyClass::*MyFunc)(float); 

但後來它不能指向float tester(float v)我不認爲你可以有一個類型可以指向。

也不應該e.MyFunc = tester;e.NameOfFunc = tester;