投射堆栈对象的指针

时间:2017-07-25 15:53:45

标签: c++ casting message-queue

我正在构建一个消息传递队列,目前我有两种类型的消息,其中一个使用模板类。

class Message {
public:
    Message() : m_iMessageType( MESSAGE_UNDEFINED ) {}
    Message( int iMessageType ) : m_iMessageType( iMessageType ) {}
    int getType() { return m_iMessageType; }
    void setType( int iMessageType ) { m_iMessageType = iMessageType; }
private:
    int m_iMessageType;
}

template<typename T>
class DataMessage: public Message {
public:
    DataMessage() : Message(), m_oData( T() ) {}
    DataMessage( int iMessageType, T oData ) : Message( iMessageType ), m_oData( oData ) {}
    T getData() { return m_oData; }
    void setData( T oData ) { m_oData = oData; }
}

允许我发送这样的消息

Message toMessage( MESSAGE_GET_NAME );
DataMessage<std::string> fromMessage();
Messenger::getMessenger()->sendMessage( &toMessage, &fromMessage, CONSUMER );
std::cout << "Consumer name: " << fromMessage.getData() << std::endl;

但是,这导致我在内部处理消息时进行类型转换(在上面的代码中将Message转换为适当的DataMessage<std::string> fromMessage)。我的一个消费者可能看起来像这样:

class Receiver {
public:
    Receiver() { Messenger::register( RECEIVER, this ); }
    handleMessage( Message* pIn, Message* pOut ) {
        // Ignoring the usual checking the message type
        (static_cast<DataMessage<std::string>*>( pOut ))->setData( "Consumer1" );
    }

如果指针指向调用方法堆栈中的对象,是否安全?

如果我尝试以下代码(这是错误的)

Message toMessage( MESSAGE_GET_NAME );
Message fromMessage; // The consumer is going to try and cast this to DataMessage<std::string>
Messenger::getMessenger()->sendMessage( &toMessage, &fromMessage, CONSUMER );

我没有收到任何段错误或错误。有什么事情发生了可怕的错误,并且在执行期间会出现问题吗?

1 个答案:

答案 0 :(得分:1)

你在这里问两个问题。

  

如果指针指向调用方法堆栈中的对象,是否安全?

是的,这是安全的。只要它真的属于您投射的类型,对象的存在位置并不重要。

但是,使用static_cast的设计并不是很好的风格。如果对象不是提供的类型,dynamic_cast至少会返回一个空指针。

  

是否出现了可怕的错误,并且在执行期间它会逐渐蔓延?

是。您已将Message投放到DataMessage。这是未定义的行为。可能你最终会在Message对象结束后简单地读取堆栈中发生的任何事情。