要将类的函数存储在数组中,以下链接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.
可以像这样定义一个数组,我无法在其他任何地方找到像这样的数组定义。如果示例正确,为什么不编译。
答案 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。
您的具体示例无法编译,因为:
(fsm. *ptrs[num])();
应为(fsm.*ptrs[num])();
- 您需要删除该空格,因为调用指向成员函数的指针应使用.*
或->*
Machine::off, Machine::on
应为&Machine::off, &Machine::on
,因为这是指向成员函数的指针。