2013-03-30 55 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