2013-03-30 88 views
0

我想獲得一個指向我的對象的實例的函數的指針。這裏是我的代碼:如何將指針傳遞給C++中的類實例函數?

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <algorithm> 
#include <numeric> 

using namespace std; 

class Dice { 
    int face; 
public: 
    Dice() { 
     face = rand() % 6 + 1; 
    } 
    int roll() { 
     face = rand() % 6 + 1; 
     return face; 
    } 
}; 

int main() 
{ 
    Dice mydice; 
    vector<int> v(1000); 
    generate(v.begin(),v.end(),mydice.roll); 
} 

我的編譯器在我吠叫與神祕郵件=的產生線)請指出如何正確地告訴生成調用mydice.roll()填充矢量v

+6

'std :: bind(&Dice :: roll,&mydice);' - 或者只是'[&] {return mydice.roll(); }'。 – Xeo

+0

[C++函數指針(類成員)可能重複到非靜態成員函數](http://stackoverflow.com/questions/990625/c-function-pointer-class-member-to-non-static-member-函數) –

+0

@Xeo請使用答案,而不是評論=) – Dima

回答

1

另一種可能的方法:利用()運算符來定義你的骰子類本身作爲函數。在你的課程中包括這個:int operator()() { return roll(); },然後你可以簡單地打電話給你的發電機generate(v.begin(),v.end(), mydice);

+0

我喜歡這個答案,因爲它也是有效的C++ 98,這是我的課程所基於的。 – Dima

+1

謝謝!也許有2條評論來自我身邊:1)使用operator()時,需要調整類名以保持代碼不言自明,因爲您不會像方法名稱「roll」中那樣自動包含動詞。 2)如果你想在課程結束後繼續使用C++,請自己幫忙,看看C++ 11帶來的變化。它們對於簡化許多C++ 03 uglines很有用,並且使編寫可讀代碼變得更容易。 – Piotr99

3

給它的對象:

generate(..., std::bind(&Dice::roll, &mydice)); 

std::bind是在<functional>和結合參數,以便一個函數可以不供給他們被調用。

+0

從Python&C來的這個語法完全不明顯......不知道你是怎麼忍受的=)))但謝謝你的答案!它可以工作\ o/ – Dima

+0

@Dima,這是一個功能性的概念,所以你可以說它對許多C++程序員來說也是不明顯的。 – chris

+0

現在你提到它,以類似Lisp的方式思考,確實使它「自然」。 – Dima