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>
인 것으로 시도했습니다. 나는 당황 스럽다.
저는이 프로젝트에서 함수 포인터를 사용하기 시작 했으므로 프로가 아닙니다. 어떤 도움이라도 대단히 감사하겠습니다! 감사합니다
와우. 그런 단순한 실수. 필자는 10 시간 동안 튼튼한 작업을하고 있었고 피곤해서 여분의 한 쌍의 눈이 필요했습니다. 무리 감사 –