我正在使用Winsock2编写服务器。收到的所有数据都是字符串形式。我有一个字符串解析器,它可以从字符串形式给出的方法签名中提取方法名称和参数。因此,AddNewMember(arg1,arg2)被拆分为一个名为signature的字符串,其中包含AddNewMember和一个包含arg1和arg2元素的字符串向量。这很好用。为了使这些消息有意义,我有一个成员函数指针的字符串映射,所有函数都采用相同的参数向量args。这是我的ServerControl类的地图:
//from header
map<string, string (ServerControl::*)(vector<string>)> functionMap;
//this on init creates all entries to function map
functionMap["AddNewMember"] = &ServerControl::AddNewMemberFunc;
functionMap["GetMember"] = &ServerControl::GetMemberFunc;
functionMap["RemoveMember"] = &ServerControl::RemoveMemberFunc;
...etc
然后,一旦将传入消息解析为其部分,以下代码将访问该映射以获取成员函数指针。
if (functionMap.find( signature ) != functionMap.end())
{
return (this->*functionMap[message])(arguments);
}
签名部分再次是“AddNewMethod”,参数是在()之间传递的paratmers的向量。
如果参数向量为空,这可以正常工作,但如果向量中添加一个参数,当代码到达此行并尝试调用成员函数时,我会收到内存访问冲突。我试过这个,参数是vector<string>*
和普通的vector<string>
。我很困惑。
我只是真的开始在这个项目中使用函数指针,所以我不是专业人士。任何帮助将不胜感激!感谢
答案 0 :(得分:1)
您正在使用signature
搜索地图,然后使用message
从地图中检索成员指针。如果signature
和message
不是相同的值,那么如果地图中不存在message
值,您将无法得到您期望的指针,甚至可能是NULL指针。检索指针时,需要再次使用signature
。更好,因为您已经执行了一次搜索,您应该使用搜索结果而不是调用[]
运算符再次执行相同的搜索。
试试这个:
typedef string (ServerControl::*VectorArgMember)(vector<string>);
map<string, VectorArgMember> functionMap;
map<string, VectorArgMember>::iterator i = functionMap.find( signature );
if (i != functionMap.end())
{
VectorArgMember memberPtr = i->second;
return (this->*memberPtr)(arguments);
}