2017-07-25 92 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对象结束后发生的任何事情。