我正在努力理解c++中的复制构造函数,我想定义自己的复制构造函数因为我的类中有一个指针成员,所以我需要一个深度复制。假设:
communicate.h
:
#ifndef communicate_h
#define communicate_h
#include "mbed.h"
class Communicate
{
private:
/* data */
BufferedSerial serial;
FILE *serial_stream;
public:
Communicate(const PinName Tx, const PinName Rx, const int baud);
Communicate(const Communicate& source);
~Communicate();
};
#endif
communicate.cpp
:
#include "communicate.h"
Communicate::Communicate(const PinName Tx, const PinName Rx, const int baud): serial(Tx, Rx, baud)
{
serial.set_blocking(false);
serial_stream = new FILE;
serial_stream = fdopen(&serial, "w+");
}
Communicate::~Communicate()
{
delete serial_stream;
}
// copy constructor
Communicate::Communicate(const Communicate& source)
{
serial = source.serial;
serial_stream = new FILE;
*serial_stream = *source.serial_stream;
}
我得到了这个:
Compile [ 99.5%]: communicate.cpp
[Error] communicate.cpp@17,51: no matching function for call to 'mbed::BufferedSerial::BufferedSerial()'
[Error] communicate.cpp@19,21: use of deleted function 'mbed::BufferedSerial& mbed::BufferedSerial::operator=(const mbed::BufferedSerial&)'
[Error] BufferedSerial.h@52,7: use of deleted function 'mbed::SerialBase& mbed::SerialBase::operator=(const mbed::SerialBase&)'
[Error] SerialBase.h@46,7: use of deleted function 'mbed::NonCopyable<T>& mbed::NonCopyable<T>::operator=(const mbed::NonCopyable<T>&) [with T = mbed::SerialBase]'
[Error] SerialBase.h@46,7: non-static const member 'const PinName mbed::SerialBase::_tx_pin', can't use default assignment operator
[Error] SerialBase.h@46,7: non-static const member 'const PinName mbed::SerialBase::_rx_pin', can't use default assignment operator
[Error] BufferedSerial.h@52,7: use of deleted function 'mbed::FileHandle& mbed::FileHandle::operator=(const mbed::FileHandle&)'
[Error] FileHandle.h@46,7: use of deleted function 'mbed::NonCopyable<T>& mbed::NonCopyable<T>::operator=(const mbed::NonCopyable<T>&) [with T = mbed::FileHandle]'
[Error] BufferedSerial.h@52,7: use of deleted function 'mbed::NonCopyable<T>& mbed::NonCopyable<T>::operator=(const mbed::NonCopyable<T>&) [with T = mbed::BufferedSerial]'
[Error] BufferedSerial.h@52,7: use of deleted function 'rtos::Mutex& rtos::Mutex::operator=(const rtos::Mutex&)'
[Error] Mutex.h@70,7: use of deleted function 'mbed::NonCopyable<T>& mbed::NonCopyable<T>::operator=(const mbed::NonCopyable<T>&) [with T = rtos::Mutex]'
该错误抱怨在Communicate
类的复制构造函数中没有调用BufferedSerial类的构造函数,另一方面,我不能简单地将: serial(Tx, Rx, baud)
放在复制构造函数定义之前。
我不知道如何在复制构造函数定义中调用成员构造函数。
错误消息告诉BufferedSerial
不可复制分配:
[Error] communicate.cpp@17,51: no matching function for call to 'mbed::BufferedSerial::BufferedSerial()'
[Error] communicate.cpp@19,21: use of deleted function 'mbed::BufferedSerial& mbed::BufferedSerial::operator=(const mbed::BufferedSerial&)'
在错误消息的末尾,您会看到:
[Error] Mutex.h@70,7: use of deleted function 'mbed::NonCopyable<T>& mbed::NonCopyable<T>::operator=(const mbed::NonCopyable<T>&) [with T = rtos::Mutex]'
类是唯一默认的复制构造,并且如果它的所有成员都是,则可以进行复制赋值。由于互斥的工作方式,它是不可复制的,而且由于互斥由BufferedSerial
的一个成员使用,BufferedSerial
本身在默认情况下不会是复制构造和可复制分配的,因此Communicate
也不应该是这样。
如果你想为你的类编写一个复制构造函数和复制赋值运算符,那么你需要弄清楚如何让两个不同的FILE
在同一个文件/管道上工作,这通常没有多大意义(或者如何在实例之间共享它们(。因为如果您这样做,尤其是使用w+
,如果流被缓冲,您肯定会遇到数据损坏的问题(这也是为什么即使不使用互斥锁,它也肯定不可复制的另一个原因(。
这表明你的设计可能存在误解。
我相信错误在复制构造函数主体的第一行,在右侧:假设serial
是该类的私有元素,则无法从设置为从中复制的Communicate
对象访问serial
。您需要定义一些get()
函数并从中复制