如何从类映射中调用成员函数

时间:2019-08-04 11:20:06

标签: c++ stdmap member-function-pointers

我正在尝试通过成员函数ptr的映射来调用成员函数 那是另一个类的数据成员

{    
    class B
    {
    public:
    typedef void (B::*funcp)(int);
    B()
    {
        func.insert(make_pair("run",&B::run));
    }
        void run(int f);
        map<string,funcp>func;
    };

    class A
    {
        public:
        A();
        void subscribe(B* b)
        {
            myMap["b"] = b;
        }
        map<string,B*>myMap;
        void doSome()
        {
             myMap["place"]->func["run"](5);
        }
    };
    int main()
    {
        A a;
        B b;
        a.subscribe(&b);
        a.doSome();
        return 0;
    }
}

但是我得到

  

错误:必须使用“。”或“-> ”来调用指针指向成员的函数   ‘(((A *)this)-> A :: myMap.std :: map,   B *> :: operator [](std :: basic_string((((const char *)“ place”),   std :: allocator()))-> B :: func.std :: map,无效   (B :: )(int)> :: operator [](std :: basic_string((((const char )“ run”),   std :: allocator()))(...)’,例如‘(...-> *   (((A *)this)-> A :: myMap.std :: map,   B *> :: operator [](std :: basic_string((((const char *)“ place”),   std :: allocator()))-> B :: func.std :: map,无效   (B :: )(int)> :: operator [](std :: basic_string((((const char )“ run”),   std :: allocator())))(...)’

我也尝试过:

{
    auto p = myMap["place"];
    (p->*func["run"])(5);
}

发现错误:

  

在此范围内未声明“ func”

2 个答案:

答案 0 :(得分:3)

B* bptr = myMap["place"];
(bptr->*(bptr->func["run"]))(5);

现在测试正常,并感谢Sombrero Chicken修复了错别字。您不需要所有这些括号,但是将它们留在里面可能是个好主意。

您缺少的是您需要两次B指针。一次是在另一个对象中查找映射,一次是使用成员函数指针调用成员函数。

答案 1 :(得分:3)

在您尝试过的代码中,p的类型为B*。为了访问其run方法指针,您应该编写p->func["run"]而不是p->*func["run"],最后要调用该方法,您应该编写p->*(p->func["run"])

void doSome() {
    // pointer to the B object
    B* p = myMap["place"];

    // pointer to the method
    B::funcp method_ptr = p->func["run"];

    // invoke the method on the object
    p->*method_ptr(5);
}