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