C ++方法指针数组

时间:2015-08-23 12:41:20

标签: arrays pointers c++11 methods

我有一个有几种方法的类。现在我希望这个类有一个方法指针数组,可以用类的实例调用。

基本上就像这样

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);
                                        ^
  1. 我不知道在哪里放*,我也不知道为什么在这里需要取消引用。对于C,据我记得,调用函数指针时不需要这样做。 我已经读过它应该是类似(this->*temp.set_func)(value);的东西,但我怎样才能使这种语法适应我的问题呢? myInstance不是该类的成员,因此我没有this。此外,myInstance不是一个指针,所以我不明白为什么*应该是必要的。任何人都可以帮我吗?
  2. 当我像这样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。

1 个答案:

答案 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的行看起来很难看,我已经添加了一个关于如何访问数组的例子。也许这对其他人有用!