我想在运行时设置函数指针。但我被困在这里。当我使用全局函数或静态类成员函数时,一切正常。但是,当函数是普通的类成员函数时。我总是遇到编译错误。 这是代码:
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
答案 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 );
我希望对你有所帮助,你可以谷歌指点成员函数,你会发现一些例子。
祝你好运!