将struct数组初始化为c ++类成员

时间:2014-03-02 19:09:46

标签: c++ arrays struct initialization function-pointers

我有课

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类

的成员函数存在

1 个答案:

答案 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;

它可以更精简,但我希望它有助于达到这一点。