0

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

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' : 只能在非静态成员函数内部引用带有适当数量参数的函数指针或引用函数 */

A a;
B b(A::aFun); 
b.execute();

在google了很多之后,我发现这std::mem_fun可能会有所帮助。但我不知道如何使用它。任何人都可以帮助我吗?

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

4

3 回答 3

4

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

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

静态/全局函数没有这个参数,所以编译成功。

为了使用A::aFun,你需要一个类的实例A

于 2012-12-02T04:04:03.983 回答
0

修改如下:

static int val;

class A   
{

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

  static  int aFun(int k) {val -= k; return val; }
};
于 2012-12-02T11:11:12.343 回答
0

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

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

 typedef int (* func)(int );

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

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

我希望对你有所帮助,你可以谷歌搜索成员函数的指针,你会找到一些例子。

祝你好运!

于 2012-12-02T23:15:06.507 回答