我有课
Class A{
};
typedef struct
{
const char *dec_text;
void (A::*TestFun)();
} Test ;
Test _funs[] = {{"testLogOK", &A::testLogOK},
{"testLoginException", &A::testLoginException}
};;
如何在构造方法中初始化此测试数组。 _funs跟踪A的方法名称和相应的地址,方法如下:
void (methodName) (void)
在构造方法中,两种方式都失败了:
_funs = {{"testLogOK", &A::testLogOK},
{"testLoginException", &A::testLoginException}
};
另一个问题是我如何调用函数指针..我试过的方式如下:
int
A::run (const char *name, int argc, ACE_TCHAR *argv[])
{
for(int i=0; i< sizeof(_funs)/sizeof(Test); i++){
Test test = _funs[i];
*(test.testFun)(); //this->*(test.fun)(); Both fail with same error
//(this->*(test.fun))() works
}
}
编译也失败,并显示消息:
error C2064: term does not evaluate to a function taking 0 arguments
[更新]
我从A类中删除了结构测试和测试_funs。但在A的方法中仍有问题:
int A::run (const char *name, int argc, ACE_TCHAR *argv[])
testLogOK和testLoginException方法确实作为A类
的成员函数存在答案 0 :(得分:2)
试试这个:
class A
{
public:
struct Test
{
const char *dec_text;
void (A::*TestFun)();
};
A(Test tt[])
{
for (int i=0; tt[i].dec_text; i++)
_funs[i] = tt[i];
}
void f1() { printf("this is f1\n"); }
void f2() { printf("this is f2\n"); }
void f3() { printf("this is f3\n"); }
Test _funs[100];
};
A::Test tt[] =
{
{ "Function f1", &A::f1},
{ "Function f2", &A::f2},
{ "Function f3", &A::f3},
{0, 0}
};
void test()
{
A a(tt);
(a.*(a._funs[0].TestFun))();
A *pa = new A(tt);
(pa->*(pa->_funs[1].TestFun))();
delete pa;
// EDIT: call f3
(a.*(tt[2].TestFun))(); // this will call directly from the global table
}
这将调用分配给指针的函数。 如果你输入指向成员的指针
,这可以改进很多typedef void (A::*PF_T)();
并使用std :: map作为容器:
std::map<std::string, PF_T> func_map;
它可以更精简,但我希望它有助于达到这一点。