メッセージキューを構築していますが、現在、テンプレートクラスを使用する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);
をしようとした場合、私は任意のセグメンテーション違反やエラーを得ることはありません。何かがひどく間違っていて、実行中に後で這い上がるでしょうか?
これは関数の宣言です: 'Message fromMessage();'。 'Message fromMessage;'または 'Message fromMessage {}; 'を使用してください – user5821508
両方の点を修正しました –
これはdynamic_castを使用できるコンテキストです。成功した場合は、ポイントされたオブジェクトへのアクセスを心配する必要はありません。操作中に有効なままである限り、その位置は関係ありません。 – jszpilewski