我可以像这样使用mem_fun吗?

时间:2012-12-02 03:57:05

标签: c++ windows algorithm stl c++11

我想在运行时设置函数指针。但我被困在这里。当我使用全局函数或静态类成员函数时,一切正常。但是,当函数是普通的类成员函数时。我总是遇到编译错误。 这是代码:

class A   
{
    int val;
public:
    A() { val = 0; }
    A(int j) { val = j; }

    int aFun(int k) {val -= k; return val; }
};

typedef int (* func)(int );
class B
{
    func m_addr;
public:
    B(func param)
        : m_addr(param)
    {

    }
    void execute()
    {
        cout << m_addr(9) << endl;
    }
};

我正试图像这样使用它们:

  

/ *错误C2355:'this':只能在非静态内部引用   成员函数错误C2064:term不计算函数   取1个参数类不会定义'operator()'或用户   将转换运算符定义为指向函数的指针或   带有适当数量参数的reference-to-function   * /

A a;
B b(A::aFun); 
b.execute();
经过google搜索后,我发现std::mem_fun可能会有所帮助。但我不知道如何使用它。有人可以帮帮我吗?

PS:我正在使用Visual C ++ 2010

3 个答案:

答案 0 :(得分:4)

类成员函数有一个名为this的编译器传递给它的额外参数,因此编译器将aFun视为开始声明并写为

int A::aFun(A* this, int k)
{
    this->val -= k;
    return this->val;
}

静态/全局函数没有此参数,因此编译成功。

为了使用A::aFun,您需要在某处提供类A的实例。

答案 1 :(得分:0)

修改如下:

static int val;

class A   
{

public:
    A() { val = 0; }
    A(int j) { val = j; }

  static  int aFun(int k) {val -= k; return val; }
};

答案 2 :(得分:0)

我没有得到你想要做什么,但我看到了一个错误,也许对你有帮助。

这是一个指向函数的指针,不是吗?

 typedef int (* func)(int );

但是你没有一个功能,你有一个类的方法。 (会员功能) 所以typedef应该是概率:

typedef int (A::*func)(int );

我希望对你有所帮助,你可以谷歌指点成员函数,你会发现一些例子。

祝你好运!