c ++:删除对象并将对象转换回父类的成员的位置

时间:2013-01-19 22:50:06

标签: c++ oop serial-port

我有一个简单的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并向它发送一个已转换为Message的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,如果我的理解是正确的,我只需要创建一个Message构造函数,该构造函数接受CustomMessage的参数...等待......这看起来很奇怪..在父级中获取子类对象参数类构造函数。我需要重新考虑一下吗?

2 个答案:

答案 0 :(得分:2)

你不需要{my}内部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);

在WriteToSerial中调用Message CustomMessage::toMessage() { return Message(m_contents, m_length); } bool CustomSerialPort::WriteToSerial(int32& errcode, const CustomMessage& msg, ^^^ const uint32* const nBytesWritten) 时,它将被绑定直到WriteToSerial()函数完成。

此外,您需要将 const 限定符添加到以toMessage()作为输入的所有函数

Message

答案 1 :(得分:1)

尽可能不要使用new。只有你应该使用new的时间是:  1.你不可能事先知道你需要多少物体,并且“少数”和“许多”之间可能的范围差别很大,因此固定大小的阵列或类似阵列是不合理的。  2.当对象的持续时间超过当前函数时,从较低的向下函数传入对象是不合理的。  3.在创建对象之前无法知道对象的类型(特别是在多态中相关)。

不使用new有助于您以后不必记住delete

如果您确实使用new,那么最好是在资源保持对象内部 - 智能指针或类似的东西 - 这样,您再也不必记得删除它。