【问题标题】:Having Class object inside the Class在类中有类对象
【发布时间】:2019-04-03 23:42:47
【问题描述】:

如何在我的类 (UART) 对象中正确使用类对象 (serial)?

我要复制的类对象在“Private”中声明了它的复制构造函数,我的编译器说:

‘serial::Serial::Serial(const serial::Serial&)’ is private within this context
     UART::UART(const serial::Serial& serial_port) : _serial(serial_port), _letter(" ") {}

以及定义

serial::Serial::Serial(const serial::Serial&)

是:

private:
  // Disable copy constructors
  Serial(const Serial&);

这是我的类头文件:

 class UART
    {
    private:
        serial::Serial _serial;
    public:
        UART(const serial::Serial& serial_port) : _serial(serial_port) {};
        ~UART();
        bool read(std::string &data);
        bool write(std::string &data);
    };

如您所见,我已经声明了一个名为_serial 的类对象,我只想在UART 类中使用这个对象,我通常通过复制构造方法来做到这一点(将serial 对象传递给UART 并复制)

因此,如果 serial 类不允许复制构造函数(因为它已在私有部分中声明),我该如何复制它(或者可能是其他方法?)并在我的 UART 类中使用此对象?

【问题讨论】:

  • 看起来像一个嵌入式(微型)系统。涉及到很多诡计。需要完整定义系列类。串行实例是否放置在内存映射的 io 端口上具有很大的相关性。否则,任何答案都会产生误导。请先提及您的平台(硬件+工具链)。

标签: c++


【解决方案1】:

如何复制它

你不能,但你可以移动它(不太可能,从你所说的来看,这看起来像 C++11 之前的代码)。

或者可能是其他方法?

要么不复制(例如,保留一个指针或对它的引用),要么构造一个新的serial 对象,或者不复制它,而是通过引用/指针将它传递给需要它的方法。

【讨论】:

  • 为什么你认为它是 C++11 之前的版本?我正在使用 C++11。我相信您的意思是串行类定义是 11 之前的?
  • @Edmund 这只是您没有提到移动构造函数并且Serial 类不使用= delete 禁用复制构造函数这一事实的猜测。
  • 但是如果我使用std::move,它将如何影响串口通信?因为第一个(原始)串行对象将成为右值
  • 对象需要支持移动语义。如果处理得当,实际的串行通信根本不会受到影响。会发生的情况是 Serial 对象现在归您所有,而原来的对象是空的(您“消耗”了它)。最后,您需要决定谁拥有该对象,或者您可能真的需要共享所有权(例如std::shared_ptr),但这很少见。
【解决方案2】:

据推测,Serial 类禁用复制,因为它代表一个物理设备;复制对象会中断与设备的通信,因为副本不知道原始对象的状态。

如果UART 应该拥有Serial 对象,您可能可以将std::move 放入UART 构造函数中。否则,您可能只想持有指向 Serial 对象的指针或引用。

class UART
{
private:
    serial::Serial& _serial;
public:
    UART(serial::Serial& serial_port) : _serial(serial_port) {};
    // etc.
};

注意对象的生命周期;如果您的 UART 对象的寿命超过您的 Serial 引用,那么取消引用被破坏的对象将导致未定义的行为。

【讨论】:

  • 在销毁串行对象之前如何确保取消引用 UART 对象?完成 UART 类后,是否应该在代码中手动调用析构函数?
  • @Edmund 为什么认为,当它是对对象的引用时,您需要销毁它?
  • @Edmund 如果您不是所有者,请不要销毁它。
  • @AlgirdasPreidžius 在销毁指针引用的对象之前,我还能如何确保从内存中释放指针?
  • @Acorn 我的意思是释放引用对象的指针,而不是对象本身
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 2013-02-28
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多