我正在构建一个消息传递队列,目前我有两种类型的消息,其中一个使用模板类。
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 );
我没有收到任何段错误或错误。有什么事情发生了可怕的错误,并且在执行期间会出现问题吗?
答案 0 :(得分:1)
你在这里问两个问题。
如果指针指向调用方法堆栈中的对象,是否安全?
是的,这是安全的。只要它真的属于您投射的类型,对象的存在位置并不重要。
但是,使用static_cast
的设计并不是很好的风格。如果对象不是提供的类型,dynamic_cast
至少会返回一个空指针。
是否出现了可怕的错误,并且在执行期间它会逐渐蔓延?
是。您已将Message
投放到DataMessage
。这是未定义的行为。可能你最终会在Message对象结束后简单地读取堆栈中发生的任何事情。