如何从 类 的映射中调用成员函数
how to call member function from map of classes
我正在尝试通过成员函数 ptr 的映射来调用成员函数
那是另一个 class
的数据成员
{
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;
}
}
但我得到
error: must use ‘.’ or ‘->’ to call pointer-to-member function in
‘((A*)this)->A::myMap.std::map,
B*>::operator[](std::basic_string(((const char*)"place"),
std::allocator()))->B::func.std::map, void
(B::)(int)>::operator[](std::basic_string(((const char)"run"),
std::allocator())) (...)’, e.g. ‘(... ->*
((A*)this)->A::myMap.std::map,
B*>::operator[](std::basic_string(((const char*)"place"),
std::allocator()))->B::func.std::map, void
(B::)(int)>::operator[](std::basic_string(((const char)"run"),
std::allocator()))) (...)’
我也试过了:
{
auto p = myMap["place"];
(p->*func["run"])(5);
}
并指出错误:
‘func’ was not declared in this scope
B* bptr = myMap["place"];
(bptr->*(bptr->func["run"]))(5);
现在测试成功,感谢 Sombrero Chicken 修正了拼写错误。您不需要所有这些括号,但将它们留在里面可能是个好主意。
您缺少的是您需要两次 B
指针。一次在另一个对象中查找映射,一次使用成员函数指针调用成员函数。
在您试过的代码中,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);
}
我正在尝试通过成员函数 ptr 的映射来调用成员函数 那是另一个 class
的数据成员{
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;
}
}
但我得到
error: must use ‘.’ or ‘->’ to call pointer-to-member function in ‘((A*)this)->A::myMap.std::map, B*>::operator[](std::basic_string(((const char*)"place"), std::allocator()))->B::func.std::map, void (B::)(int)>::operator[](std::basic_string(((const char)"run"), std::allocator())) (...)’, e.g. ‘(... ->* ((A*)this)->A::myMap.std::map, B*>::operator[](std::basic_string(((const char*)"place"), std::allocator()))->B::func.std::map, void (B::)(int)>::operator[](std::basic_string(((const char)"run"), std::allocator()))) (...)’
我也试过了:
{
auto p = myMap["place"];
(p->*func["run"])(5);
}
并指出错误:
‘func’ was not declared in this scope
B* bptr = myMap["place"];
(bptr->*(bptr->func["run"]))(5);
现在测试成功,感谢 Sombrero Chicken 修正了拼写错误。您不需要所有这些括号,但将它们留在里面可能是个好主意。
您缺少的是您需要两次 B
指针。一次在另一个对象中查找映射,一次使用成员函数指针调用成员函数。
在您试过的代码中,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);
}