2017-07-25 3 views
0

メッセージキューを構築していますが、現在、テンプレートクラスを使用する2種類のメッセージがあります。スタックオブジェクトのキャストポインタ

しかし、これは(上記のコードで fromMessageのために適切な DataMessage<std::string>Messageをキャスト)は、内部メッセージの処理中に型キャストを行うに私を導き、私はこの

Message toMessage(MESSAGE_GET_NAME); 
DataMessage<std::string> fromMessage(); 
Messenger::getMessenger()->sendMessage(&toMessage, &fromMessage, CONSUMER); 
std::cout << "Consumer name: " << fromMessage.getData() << std::endl; 

のようなメッセージを送ることができます

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; } 
} 

。私の消費者の一人は次のようになります:

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

ここで2つの質問をしています。

ポインタを呼び出しメソッドのスタック上のオブジェクトを指す場合、ポインタをキャストすることは安全ですか?

はい、これは安全です。オブジェクトを実際にキャストしている限り、オブジェクトの存続期間は問題ありません。

しかし、static_castのデザインは本当に良いスタイルではありません。 dynamic_castは、オブジェクトが指定された型でない場合、少なくともNULLポインタを返します。

何かがひどく間違っていて、実行中に後でうねりますか?

はい。 MessageDataMessageにキャストしました。それは未定義の動作です。場合によっては、Messageオブジェクトの終了後にスタック上にあることを単に読み取るだけで終わるでしょう。

関連する問題