一个类的函数数组

时间:2011-12-12 15:49:45

标签: c++

要将类的函数存储在数组中,以下链接http://sourcemaking.com/design_patterns/state/cpp/1包含如下代码(Machine是类名)。

void(Machine:: *ptrs[])() = 
  {
    Machine::off, Machine::on
  };

该链接中的示例不能使用g ++编译器抛出错误,如下所示

$ g++ state.cpp 
state.cpp: In function ‘int main()’:
state.cpp:89:18: error: invalid use of non-static member function ‘void Machine::off()’
state.cpp:89:32: error: invalid use of non-static member function ‘void Machine::on()’
state.cpp:97:15: error: expected unqualified-id before ‘*’ token

我正在使用g ++版本4.5.2

$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

可以像这样定义一个数组,我无法在其他任何地方找到像这样的数组定义。如果示例正确,为什么不编译。

3 个答案:

答案 0 :(得分:2)

如果您定义typedef for your member functions,则会大大简化您的代码。

class Machine
{
public:
    void on(){}
    void off(){}
};


int main()
{

    typedef void (Machine::*MachineFunctionPtr)();

    MachineFunctionPtr temp[] = { &Machine::off , &Machine::on };


   //To invoke a function use this syntax
    Machine mymachine;
   ((mymachine).*(temp[1]))();

据说你的错误是由于缺少“&”在功能名称之前

如果您不想use typedef the correct way is something like

void(Machine:: *ptrs[])() = 
{
    &Machine::off, &Machine::on
};
Machine fsm;
int num;
while (1)
{
    cout << "Enter 0/1: ";
    cin >> num;
    ((fsm).*(ptrs[num]))();
}

答案 1 :(得分:2)

为了能够将您的成员函数指针添加到您的数组,您需要使用地址操作符&添加其标识符。

示例:

struct Obj {
  void func_1 () {}
  void func_2 () {}
};

int
main (int argc, char *argv[])
{
  void (Obj::* pointers[]) () = {
    &Obj::func_1, &Obj::func_2
  };
}

答案 2 :(得分:1)

这是更多c ++方式:

#include <vector>
#include <iostream>

struct A {
  typedef void (A::*memfpt)();

    A() : arr( { &A::foo, &A::bar } )
    {}

  void foo()
  {
    std::cout<<"foo"<<std::endl;
  }
  void bar()
  {
    std::cout<<"bar"<<std::endl;
  }

  std::vector< memfpt > arr;
};

int main() {
    A a;

    for ( auto &it : a.arr )
    {
        (a.*it)();
    }
}

我使用std :: vector代替原始数组,而不是那种无法形容的憎恶,我使用了the typedef

您的具体示例无法编译,因为:

  1. 第97行:(fsm. *ptrs[num])();应为(fsm.*ptrs[num])(); - 您需要删除该空格,因为调用指向成员函数的指针应使用.*->*
  2. 第89行:Machine::off, Machine::on应为&Machine::off, &Machine::on,因为这是指向成员函数的指针。