堆栈对象的转换指针
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 对象结束后堆栈中的任何内容。
我正在构建消息队列,目前我有两种类型的消息,其中一种使用模板 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 对象结束后堆栈中的任何内容。