从父级到子级的dynamic_cast问题
Issues with dynamic_cast from parent to child
我在一个基本的客户端服务器应用程序在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)
给出类的大小。即使这样,我也不确定这是正确的方法,因为每个类对象都将包含一个指向处理动态调度/虚函数调用的虚函数表的指针,并且使用您使用的原始强制转换方法跨机器发送类将使该指针无效。
我认为你应该首先序列化你的对象(即转换成一个字符流),然后通过网络发送它,然后反序列化重建类:有可能在c++中序列化和反序列化一个类吗?
去掉所有的虚方法,并将MessageType作为成员变量存储在BattleshipMethod中。那么你的代码应该可以工作了。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理