2013-03-04 3 views
1

Winsock2를 사용하여 서버에 쓰는 중입니다. 수신 된 모든 데이터는 문자열 형식입니다. 메서드 이름과 문자열 형식의 메서드 시그니처 인수를 가져올 수있는 문자열 파서가 있습니다. 따라서 AddNewMember (arg1, arg2)는 AddNewMember를 포함하는 signature라는 문자열과 그 요소에 arg1과 arg2를 포함하는 문자열의 벡터로 나뉩니다. 이것은 잘 작동합니다. 이러한 메시지를 의미있게 만들려면 멤버 함수 포인터에 문자열 맵이 있고 모든 함수는 동일한 매개 변수 벡터 args를 사용합니다. 들어오는 메시지의 부분으로 해석되고 나면 포인터에서 멤버 함수를 호출하는 C++이 인수가 도입 될 때 메모리 액세스 위반을 호출합니다.

//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 

은 다음 코드는 멤버 함수 포인터를 얻을 수있는지도를 액세스 : 여기 내 ServerControl 클래스에서 내지도입니다.

if (functionMap.find(signature) != functionMap.end()) 
{ 
    return (this->*functionMap[message])(arguments); 
} 

다시 한 번 서명 부분은 "AddNewMethod"이며, 인수 사이에 전달 paratmers 제()의 벡터이다.

인수 벡터가 비어 있지만 한 번만 인수가 벡터에 추가되면 코드가이 줄에 도달하고 구성원 함수를 호출하려고하면 메모리 액세스 위반이 발생합니다. Ive는 인수가 vector<string>* 일뿐만 아니라 일반 vector<string> 인 것으로 시도했습니다. 나는 당황 스럽다.

저는이 프로젝트에서 함수 포인터를 사용하기 시작 했으므로 프로가 아닙니다. 어떤 도움이라도 대단히 감사하겠습니다! 감사합니다

답변

1

지도를 검색하는 데 signature을 사용하고 있지만 message을 사용하여지도에서 구성원 포인터를 검색하고 있습니다. signaturemessage이 같은 값이 아니면 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); 
} 
+0

와우. 그런 단순한 실수. 필자는 10 시간 동안 튼튼한 작업을하고 있었고 피곤해서 여분의 한 쌍의 눈이 필요했습니다. 무리 감사 –