gpt4 book ai didi

c++ - 从 parent 到 child 的 dynamic_cast 问题

转载 作者:太空狗 更新时间:2023-10-29 21:24:26 24 4
gpt4 key购买 nike

我正在使用 C++ 开发一个基本的客户端服务器应用程序,使用将运行战舰游戏的套接字。客户端和服务器之间的所有通信都采用简单的对象层次结构形式,如下所示:

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++ 实现正常工作。

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;
}

当我取消引用指针并尝试调用 get_type() 时,我得到了 Access violation reading location。谁能指出我正确的方向?

最佳答案

sizeof(message)

给出指针的大小,通常是 32 位或 64 位,具体取决于您的机器。你要

sizeof(BattleshipMessage)

它给出了类的大小。即使那样,我也不确定这是正确的方法,因为每个类对象都将包含一个指向处理动态调度/虚拟函数调用的 vtable 的指针,并且使用您使用的原始转换方法跨机器发送类将使无效那个指针。

我认为您应该先序列化您的对象(即将其转换为字符流),然后再通过网络发送它,然后反序列化以重建类: Is it possible to serialize and deserialize a class in C++?

关于c++ - 从 parent 到 child 的 dynamic_cast 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com