调用成员函数指针的语法是什么,该指针是C ++中结构数组的成员

时间:2012-03-12 21:31:17

标签: c++ arrays function-pointers structure

这个问题类似于我正在尝试的Calling C++ member function pointer from a struct。 但是我的结构包含一个成员函数指针,该指针在不同的类中定义,然后是定义和使用的结构。下面是我的类,结构和函数指针的布局示例代码。

// Alpha.h:
class Alpha{
public:
    void function1(char name[], int number);
    void function2(char name[], int number);
    void function3(char name[], int number);

    typedef void (Alpha::*My_func_ptr)(char name[], int number);

    static My_func_ptr functionTable[];
};

// Alpha.cpp:
#include "Alpha.h"

Alpha::My_func_ptr Alpha::functionTable[] = {
    &Alpha::function1, 
    &Alpha::function2, 
    &Alpha::function3
};

void Alpha::function1(char name[], int number)
{
    //some stuff
}

void Alpha::function2(char name[], int number)
{
    //some stuff
}

void Alpha::function3(char name[], int number)
{
    //some stuff
}

// Beta.h:
#include "Alpha.h"

typdef struct{
    char bName[10];
    Alpha::My_func_ptr fptr;
}ptr_structure;

class Beta{
public:
      void betafunction();

      Alpha alphaobject;
      ptr_structure str_array[3];
};

// Beta.cpp:
#include "Beta.h"

void betafunction()
{
    str_array[0].fptr = alphaobject.functionTable[0];
    str_array[1].fptr = alphaobject.functionTable[1];
    str_array[2].fptr = alphaobject.functionTable[2];

    (str_array[0].fptr)("name", 1); //gives error expression must have 
                                    //(pointer-to-)  function type

    (this->*str_array[0].fptr)("name", 1);
    //error pointer-to-member selection class types are incompatible "Beta" and "Alpha"

    //sample function pointer call using function table from other class,
    //this syntax compiles and runs without error.
    (alphaobject.*Alpha::functionTable[0]("name", 1); 
}

正如您所看到的,我可以从数组中调用函数指针,但似乎无法弄清楚如何从结构数组中调用函数指针。

3 个答案:

答案 0 :(得分:3)

调用直通成员函数指针时,需要有一个与该指针关联的对象实例:

 (alphaobject.*(str_array[0].fptr))("name", 1)
  ^^^^^^^^^^^

答案 1 :(得分:0)

我想:

(object.*functionTable[0])(args, ...);
(objptr->*functionTable[0])(args, ....);

IIRC,object.*运算符的组合就像一个大的一元运算符。因此,[0]后缀的优先级较低。但是,它还具有比函数调用后缀运算符(args, ...)

更低的预定义

打个比方:

(*foo)();  /* classic C */

当然,调用常规函数时不需要*运算符。但如果你写它,你需要parens,因为*foo()意味着别的东西。

答案 2 :(得分:0)

您可以转到两种解决方案之一,具体取决于您希望代码的可读性。不可读的版本(甚至可能是错误的,我甚至不会尝试编译):

void Beta::betafunction() {
   Alpha a;
   (a.*(strArray[0].fptr))("name",1);
}

但我实际上会尝试让事情变得更简单:

void Beta::betafunction() {
   Alpha a;
   Alpha::My_func_ptr mptr = strArray[0].fptr;
   (a.*mptr)("name",1);
}

我相信第二个更具可读性,编译器可以非常轻松地优化mptr,因此尝试使用语法来播放 guru 毫无意义。