1

我正在使用 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”,参数是在 () 之间传递的参数向量。

如果参数向量为空,这将按预期工作,但即使一旦将参数添加到向量中,当代码到达此行并尝试调用成员函数时,我都会遇到内存访问冲突。我试过这个,参数是 avector<string>*和普通的vector<string>。我很困惑。

我才真正开始在这个项目上使用函数指针,所以我不是专业人士。任何帮助将不胜感激!谢谢

4

1 回答 1

1

您正在使用signature搜索地图,但随后使用message从地图中检索成员指针。如果signature和不是相同的值,您将不会得到您期望的指针,如果映射中尚不存在message该值,甚至可能是 NULL 指针。检索指针时message需要再次使用。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); 
}
于 2013-03-04T19:21:10.057 回答