0
我正在建立一个消息队列,目前我有两种类型的消息,其中一种使用模板类。堆栈对象的投射指针
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);
我没有得到任何段错误或错误。是否有可怕的错误,并且在执行过程中会稍后蠕变?
这是函数声明:'Message fromMessage();'。使用'Message fromMessage;'或'Message fromMessage {};' – user5821508
修复了您的两点 –
这是您可以使用dynamic_cast的上下文。如果成功,则没有理由担心访问指向的对象。只要在操作过程中保持有效,它就位于何处并不重要。 – jszpilewski