1

シンプルな 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 コンストラクターを作成する必要があります... 待って... 奇妙に思えます.. 親クラスのコンストラクターで子クラスのオブジェクト パラメーターを取得します。これを再考する必要がありますか?

4

2 に答える 2

2

new MessagetoMessage() 内に入れる必要はなく、削除する必要もありません。

変化する

Message& CustomMessage::toMessage() 
{
    Message* msg = new Message(m_contents, m_length);
    return *msg;
}

bool CustomSerialPort::WriteToSerial(int32& errcode, CustomMessage& msg, 
    uint32* const nBytesWritten);

Message CustomMessage::toMessage() 
{
    return Message(m_contents, m_length);
}

bool CustomSerialPort::WriteToSerial(int32& errcode, const CustomMessage& msg, 
                                                     ^^^ const
    uint32* const nBytesWritten)

WriteToSerialtoMessage()で呼び出されると、WriteToSerial() 関数が終了するまでバインドされます。

また、入力として受け取るすべての関数にconst修飾子を追加する必要がありますMessage

class SerialPort
{
public:
    bool OpenSerial(int32& errcode);  
    bool ReadFromSerial(int32& errcode, const Message& msg);  
    bool WriteToSerial(int32& errcode, const Message& msg, 
        uint32* const nBytesWritten);
...
}
于 2013-01-19T22:53:14.810 に答える
1

可能な限り、使用しないでnewください。new を使用する必要があるのは次の場合だけです: 1. 必要なオブジェクトの数を事前に知ることができず、可能な範囲が「少数」と「多数」で大きく異なるため、固定サイズの配列などを使用するのは合理的ではありません。 . 2. オブジェクトが現在の関数よりも長く存続する必要があり、下位の関数からオブジェクトを渡すことが妥当でない場合。3. オブジェクトが作成される前にオブジェクトのタイプを知ることはできません (特にポリモーフィズムに関連します)。

使用しないと、後でnew思い出す必要がないという点で役立ちますdelete

を使用する場合はnew、リソースを保持するオブジェクト (スマート ポインターなど) 内にあることが最善です。そのようにすると、忘れずに削除する必要がなくなります。

于 2013-01-19T22:58:32.203 に答える