2017-07-25 90 views
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); 

我沒有得到任何段錯誤或錯誤。是否有可怕的錯誤,並且在執行過程中會稍後蠕變?

+0

這是函數聲明:'Message fromMessage();'。使用'Message fromMessage;'或'Message fromMessage {};' – user5821508

+0

修復了您的兩點 –

+1

這是您可以使用dynamic_cast的上下文。如果成功,則沒有理由擔心訪問指向的對象。只要在操作過程中保持有效,它就位於何處並不重要。 – jszpilewski

回答

1

你在這裏問兩個問題。

如果它指向一個調用方法堆棧上的對象,那麼它是否安全?

是的,這是安全的。不管物體在哪裏居住,只要它真的屬於你所投射的類型。

但是,您的設計與static_cast是不是很好的風格。如果對象不是所提供的類型,則至少會返回一個空指針。

是否會出現可怕的錯誤,並在執行過程中稍後蠕動?

是的。您鑄造了MessageDataMessage。這是未定義的行爲。可能你最終只會讀取Message對象結束後發生的任何事情。