我正在尝试通过成员函数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”
答案 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);
}