シンプルな Message クラスとシンプルな SerialPort クラスがあります。特定のメッセージ サブクラスと特定のシリアル ポート サブクラス (CustomMessage & CustomSerialPort) もあります。
class Message
{
public:
uint8 getLength() const ( return m_length; }
const uint8* getData() const { return m_contents; }
...
}
class SerialPort
{
public:
bool OpenSerial(int32& errcode);
bool ReadFromSerial(int32& errcode, Message& msg);
bool WriteToSerial(int32& errcode, Message& msg,
uint32* const nBytesWritten);
...
}
カスタムクラスはこちら。Message だけでなく CustomMessage を取得するために、WriteToSerial() をオーバーロードしたことに注意してください。
class CustomSerialPort : public SerialPort
{
public:
bool WriteToSerial(int32& errcode, CustomMessage& msg,
uint32* const nBytesWritten);
...
}
class CustomMessage : public Message
{
// lots of stuff for messages to specific device
}
CustomSerial::WriteToSerial と CustomMessage::toMessage() の実装も重要です。
bool CustomSerialPort::WriteToSerial(int32& errcode, CustomMessage& msg,
uint32* const nBytesWritten)
{
SerialPort::WriteToSerial(errcode, msg.toMessage(), nBytesWritten);
}
Message& CustomMessage::toMessage()
{
Message* msg = new Message(m_contents, m_length);
return *msg;
}
SerialPort クラスの WriteToSerial を呼び出し、メッセージに変換された CustomMessage を送信していることがわかります。
私の質問はこれです: SerialPort::WriteToSerial に渡すために作成したメッセージをどこで削除すればよいですか?
または、次のようなことをもっと行う必要があります。
bool CustomSerialPort::WriteToSerial(int32& errcode, CustomMessage& msg,
uint32* const nBytesWritten)
{
// don't use new
Message m(msg);
SerialPort::WriteToSerial(errcode, m, nBytesWritten);
// deleted when goes out of scope
}
次に、オプション 2 で、私の理解が正しければ、CustomMessage のパラメーターを受け取る Message コンストラクターを作成する必要があります... 待って... 奇妙に思えます.. 親クラスのコンストラクターで子クラスのオブジェクト パラメーターを取得します。これを再考する必要がありますか?