我有一个有几种方法的类。现在我希望这个类有一个方法指针数组,可以用类的实例调用。
基本上就像这样
class MyClass
{
public:
MyClass(int aInit);
typedef int (MyClass::*myPtr)(int);
const myPtr ptrArray[2];
const myPtr ptrSingle;
int plus(int b);
int minus(int b);
private:
int a;
};
使用如下实现:
MyClass::MyClass(int aInit) :
ptrArray({&MyClass::plus, &MyClass::minus}),
ptrSingle(&MyClass::plus)
{
this->a = aInit;
}
int MyClass::plus(int b)
{
return (this->a + b);
}
int MyClass::minus(int b)
{
return (this->a - b);
}
从另一个类中,我使用MyClass这个方法,我尝试访问函数指针成员:
MyClass myInstance(10);
MyClass::myPtr function = myInstance.ptrSingle;
int ret1 = function(1);
int ret2 = myInstance.ptrArray[0](1);
int ret3 = myInstance.ptrArray[1](1);
这会导致出现以下错误消息:
error: must use '.*' or '->*' to call pointer-to-member function in 'function (...)', e.g. '(... ->* function) (...)'
int ret1 = function(1);
^
error: must use '.*' or '->*' to call pointer-to-member function in 'myInstance.MyClass::ptrArray[0] (...)', e.g. '(... ->* myInstance.MyClass::ptrArray[0]) (...)'
int ret2 = *(myInstance.ptrArray[0])(1);
^
error: must use '.*' or '->*' to call pointer-to-member function in 'myInstance.MyClass::ptrArray[1] (...)', e.g. '(... ->* myInstance.MyClass::ptrArray[1]) (...)'
int ret3 = myInstance.ptrArray[1](1);
^
(this->*temp.set_func)(value);
的东西,但我怎样才能使这种语法适应我的问题呢? myInstance不是该类的成员,因此我没有this
。此外,myInstance不是一个指针,所以我不明白为什么*应该是必要的。任何人都可以帮我吗?
const myPtr ptrArray[] = {&MyClass::plus, &MyClass::minus};
初始化myPtr时,编译器会抱怨too many initializers for 'int (MyClass::* const [0])(int)'
。但是不应该使用c ++ 11对非int类型进行这样的初始化吗?
我正在使用gcc(Gentoo 4.9.3 p1.0,pie-0.6.2)4.9.3和c ++ 11。
答案 0 :(得分:0)
感谢评论部分的Igor Tandetnik,我现在可以回答问题1:
MyClass myInstance(10);
MyClass::myPtr function = myInstance.ptrSingle;
MyClass::myPtr functionFromArray = myInstance.ptrArray[1];
int ret1 = (myInstance.*function)(1);
int ret2 = (myInstance.*(myInstance.ptrArray[0]))(1);
int ret3 = (myInstance.*(myInstance.ptrArray[1]))(1);
int ret4 = (myInstance.*functionFromArray)(1);
我的错误是假设方法指针直接指向实例的方法。 Ans因为ret2和3的行看起来很难看,我已经添加了一个关于如何访问数组的例子。也许这对其他人有用!