我有一个简单的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);
...
}

这是自定义类。请注意,我重载了WriteToSerial()以接受CustomMessage而不是Message。
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,该消息已转换为Message。

我的问题是:我应该在哪里删除我创建的传递给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,如果我的理解是正确的,我只需要制作一个带构造函数的Message构造函数,该构造函数采用CustomMessage参数...等待...这似乎很奇怪。在父类构造函数中采用子类对象参数。我需要重新考虑吗?

最佳答案

您无需在toMessage()中添加new Message,也无需删除它。

更改

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)

在WriteToSerial中调用toMessage()时,它将绑定(bind)直到WriteToSerial()函数完成。

另外,您需要向所有以Message作为输入的函数中添加 const 限定符
class SerialPort
{
public:
    bool OpenSerial(int32& errcode);
    bool ReadFromSerial(int32& errcode, const Message& msg);
    bool WriteToSerial(int32& errcode, const Message& msg,
        uint32* const nBytesWritten);
...
}

关于c++ - c++:删除对象并将对象转换回父类成员的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14419738/

10-11 00:43