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

shijie xu

我有课

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类中删除了结构Test和Test _funs。但是在A的方法中仍然有问题:

int   A::run (const char *name, int argc, ACE_TCHAR *argv[])

testLogOK和testLoginException方法确实作为类A的成员函数存在

DNT

尝试这个:

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
}

这将调用分配给指针的函数。如果您键入def指向成员的指针,则可以大大改善

typedef void (A::*PF_T)();

并使用std :: map作为容器:

std::map<std::string, PF_T> func_map;

可以进一步简化它,但是我希望到目前为止可以有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

引用初始化为类的成员

来自分类Dev

将静态成员数组初始化为零

来自分类Dev

C ++中类数组成员的初始化

来自分类Dev

如何将模板类的静态成员变量声明/定义/初始化为类的静态成员变量?

来自分类Dev

C ++类静态成员初始化

来自分类Dev

类成员,隐式初始化为零?

来自分类Dev

数组作为类成员

来自分类Dev

删除类数组的成员

来自分类Dev

C ++索引类成员

来自分类Dev

C ++类成员存储

来自分类Dev

C ++结构/类成员

来自分类Dev

C ++索引类成员

来自分类Dev

在C ++中将2D指针数组初始化为成员变量

来自分类Dev

在C ++中将2D指针数组初始化为成员变量

来自分类Dev

初始化包含数组的类的静态成员?

来自分类Dev

初始化数组列表中的特定类成员

来自分类Dev

将类成员变量初始化/分配给其他类成员变量

来自分类Dev

std :: vector类成员的初始化

来自分类Dev

初始化聚合为类成员

来自分类Dev

类成员初始化的最佳实践

来自分类Dev

初始化模板类的静态成员

来自分类Dev

{} vs.()类成员的初始化

来自分类Dev

初始化禁止复制的成员类

来自分类Dev

初始化静态类成员

来自分类Dev

类参考成员列表初始化

来自分类Dev

初始化类成员的最佳方法?

来自分类Dev

什么是语法,将接口初始化为类数组?(新的IItemTransform [0])

来自分类Dev

什么是语法,将接口初始化为类数组?(新的IItemTransform [0])

来自分类Dev

如何将二维数组初始化为类变量?