class manip{
public:
int t;
manip(int tom){
t = tom;
}
int sub(int val){
return t - val;
}
int add(int val){
return t + val;
}
int perform(int(manip::*key)(int), int val){
return (this->*key)(val);
}
};
int main() {
manip g(5);
cout << g.perform(&manip::add, 9) << ":" << g.perform(&manip::sub, 9);
(这只是我试图在更大的代码中解决的问题的简化版本)
问题出在这里
int(b::*func)(int) = b::add;
int c = func(2);
这给了我第二行的语法错误(因为我没有引用“this”数据)。我如何更改它,以便被调用的函数不是b :: add而是inst.add。
编辑:发布了代码的工作版本。谢谢Speed8ump
答案 0 :(得分:2)
在你的例子中'func'是一个成员函数指针。必须使用 on 它所属的数据类型的实例:
int c = (inst.*func)(2);
答案 1 :(得分:1)
您需要提供指向struct(或aA)的参数。
int main(){
b inst(5)
int(b::*func)(int, struct b*) = b::add;
int c = func(2, &inst);
}
int add(int a, struct b* ptr){
return a + ptr->aA;
}
答案 2 :(得分:1)
如果您的编译器足够新,您可以避免使用函数指针并使用std :: function代替
int(b::*func)(int) = b::add;
变为
#include <functional>
#include <iostream>
class manip{
public:
int t;
manip(int tom){
t = tom;
}
int sub(int val){
return t - val;
}
int add(int val){
return t + val;
}
int perform(std::function<int(manip*,int)>f, int val){
return f(this, val);
}
};
int main() {
manip g(5);
std::cout << g.perform(&manip::add, 9) << ":" << g.perform(&manip::sub, 9);
}