전함을 사용하는 소켓을 사용하여 C++에서 기본 클라이언트 서버 응용 프로그램을 만들고 있습니다. 소켓을 통해 전송 객체를 수신 할 때부모와 자식의 dynamic_cast 관련 문제
namespace Message {
enum MessageType { BASE, RESULT };
class BattleshipMessage {
public:
virtual MessageType get_type() { return BASE; }
virtual ~BattleshipMessage() {}
};
class ResultMessage : public BattleshipMessage {
public:
char _attackResult;
ResultMessage(char result) : _attackResult(result) {}
virtual MessageType get_type() { return RESULT; }
~ResultMessage() {}
};
}
, 나는 일반적인 BattleshipMessage로받을 수 있도록하고 싶습니다 : 클라이언트와 서버 사이의 모든 통신은 다음과 같이 보입니다 간단한 객체 계층 구조의 형태로 get_type()에 의해 반환 된 MessageType을 기반으로 적절한 자식 클래스에 캐스트하면 메시지를 처리하는 데 필요한 추가 정보를 검색 할 수 있습니다. 나는 C#이 부드럽게 만들었 기 때문에 ResultMessage result = message as ResultMessage
과 같은 쉬운 문법으로 이런 종류의 일을 해냈다.하지만 나는 내 C++ 구현을 시도하려고 애써왔다. 내가 포인터 역 참조) (get_type를 호출 할 때
BattleshipMessage* message;
recv(hAccepted, reinterpret_cast<char*>(&message), sizeof(message), 0);
switch (message->get_type()) {
case RESULT:
if (ResultMessage* result = dynamic_cast<ResultMessage*>(message)) {
std::string celebration = "HOORAY!";
}
break;
}
나는 Access violation reading location
를 얻을. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?
'message'가 이미 포인터이기 때문에'reinterpret_cast (message)'하지 않아야합니까? 그렇지 않으면'message'가 가리키는 데이터 대신'message' 주소를 변경합니다. 대답은 또한 좋은 지적을 제기합니다. –
loganfsmyth