C++ 在类中具有类对象
如何在我的类(C++ 在类中具有类对象,c++,C++,如何在我的类(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(" ") {} 以及
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&)
是:
这是我的类头文件:
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);
};
如您所见,我已经声明了一个名为\u serial
的类对象,我只想在UART
类中使用这个对象,我通常通过复制构造方法(将serial
对象传递到UART
的构造中并复制它)
因此,如果serial
类不允许复制构造函数(因为它已在private部分声明),我如何复制它(或者可能是其他方法?)并在UART
类中使用此对象
我怎样才能复制它
您不能,但您可能能够移动它(从您所说的来看,这看起来像是C++11之前的代码,不太可能)
或者可能是其他方法
不要复制(例如,保留一个指针或对它的引用),或者构造一个新的serial
对象,或者不是复制它,而是通过引用/指针将它传递给需要它的方法
我怎样才能复制它
您不能,但您可能能够移动它(从您所说的来看,这看起来像是C++11之前的代码,不太可能)
或者可能是其他方法
要么不复制(例如,保留一个指针或对它的引用),要么构造一个新的
serial
对象,或者不是复制它,而是通过引用/指针将它传递给需要它的方法。据推测,serial
类禁用复制,因为它代表一个物理设备;复制对象会中断与设备的通信,因为副本不知道原始对象的状态
如果UART
应该拥有Serial
对象,您可能可以std::将它移动到UART
构造函数中。否则,您可能只想持有一个指向Serial
对象的指针或引用
class UART
{
private:
serial::Serial& _serial;
public:
UART(serial::Serial& serial_port) : _serial(serial_port) {};
// etc.
};
了解对象的生命周期;如果您的UART
对象比您的Serial
引用寿命长,则取消对已销毁对象的引用将导致未定义的行为。推测,Serial
类禁用复制,因为它代表一个物理设备;复制对象会中断与设备的通信,因为副本不知道原始对象的状态
如果UART
应该拥有Serial
对象,您可能可以std::将它移动到UART
构造函数中。否则,您可能只想持有一个指向Serial
对象的指针或引用
class UART
{
private:
serial::Serial& _serial;
public:
UART(serial::Serial& serial_port) : _serial(serial_port) {};
// etc.
};
了解对象的生命周期;如果您的UART
对象比您的Serial
引用寿命长,那么取消对已销毁对象的引用将导致未定义的行为。如何确保在销毁Serial对象之前取消对UART对象的引用?当我要处理UART类时,我应该在代码中手动调用析构函数吗?@Edmund为什么认为,当它是对对象的引用时,你需要销毁它?@Edmund如果你不是所有者,你不能破坏它。@AlgirdasPreidžius在破坏指针引用的对象之前,我如何确保从内存中释放指针?@Acorn我的意思是释放引用对象的指针,而不是对象本身,我如何确保在破坏串行对象之前解除对UART对象的引用?当我要处理UART类时,我应该在代码中手动调用析构函数吗?@Edmund为什么认为,当它是对对象的引用时,你需要销毁它?@Edmund如果你不是所有者,你不能破坏它。@AlgirdasPreidžius在破坏指针引用的对象之前,我如何确保从内存中释放指针?@Acorn我的意思是释放引用对象的指针,而不是对象本身为什么你认为它是C++11之前的?我正在使用C++11。我相信你的意思是串行类定义是11之前的?@Edmund这只是一个猜测,因为你没有提到移动构造函数,serial
类没有使用=delete
来禁用复制构造函数。但是如果我使用std::move,它将如何影响串行端口通信?由于第一个(原始)串行对象将成为移动对象,因此该对象需要支持移动语义。如果操作正确,实际串行通信不应受到任何影响。发生的情况是,Serial
对象现在归您所有,而原始对象是空的(您“消费”了它)。最后,您需要决定谁拥有该对象,或者您确实需要共享所有权(例如,std::shared_ptr
),但这很少见。为什么您认为它是C++11之前的版本?我正在使用C++11。我相信你的意思是串行类定义是11之前的?@Edmund这只是一个猜测,因为你没有提到移动构造函数,serial
类没有使用=delete
来禁用复制构造函数。但是如果我使用std::move,它将如何影响串行端口通信?由于第一个(原始)串行对象将成为移动对象,因此该对象需要支持移动语义。如果操作正确,实际串行通信不应受到任何影响。发生的情况是,Serial
对象现在归您所有,而原始对象是空的(您“消费”了它)。最后,您需要决定谁拥有该对象,或者您确实需要共享所有权(例如,std::shared_ptr
),但这种情况很少见。看起来像嵌入式(micro-con)系统。这里面有很多诡计。需要完整定义串行类。串行实例是否放置在内存映射的io端口上,关系重大。否则,答案是什么