堆栈对象的转换指针

Casting Pointer of Stack Objects

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

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 转换为 fromMessage 的适当 DataMessage<std::string>。我的一位消费者可能看起来像这样:

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

我没有收到任何段错误或错误。是不是出了什么大问题,以后会在执行过程中慢慢出现?

你在这里问了两个问题。

Is it safe to cast a pointer if it points to an object on the stack of a calling method?

是的,这是安全的。只要对象确实属于您将其转换为的类型,对象位于何处并不重要。

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

Is something going horribly wrong and it'll creep up later during execution?

是的。您将 Message 转换为 DataMessage。那是未定义的行为。可能你最终会简单地读取 Message 对象结束后堆栈中的任何内容。