3

I'm working on a basic client server application in C++ using sockets that will run a game of battleship. All communication between client and server is in the form of a simple object hierarchy that looks something like this:

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() {}
    };
}

When receiving an object sent through the socket, I would like to be able to receive it as a generic BattleshipMessage and then based on the MessageType returned by get_type() cast it to the appropriate child class to retrieve whatever additional information I might need to process the message. I'm afraid that C# has made me soft as I've done this sort of thing with easy syntax like ResultMessage result = message as ResultMessage however I'm stuck trying to get my C++ implementation working.

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

I get Access violation reading location when I dereference the pointer and try to call get_type(). Can anyone point me in the right direction?

4

2 に答える 2

3
sizeof(message)

ポインターのサイズを指定します。これは通常、コンピューターに応じて 32 ビットまたは 64 ビットです。あなたがしたい

sizeof(BattleshipMessage)

クラスのサイズを示します。それでも、各クラスオブジェクトには動的ディスパッチ/仮想関数呼び出しを処理する vtable へのポインターが含まれ、使用する生のキャストアプローチを使用してマシン間でクラスを送信すると無効になるため、これが正しいアプローチであるかどうかはわかりません。そのポインター。

オブジェクトをネットワーク経由で送信する前に、まずオブジェクトをシリアル化 (つまり、文字のストリームに変換) してから、逆シリアル化してクラスを再構築する必要があると思います: Is it possible to serialize and desserialize a class in C++?

于 2013-04-21T02:20:38.753 に答える