在复制构造函数定义中调用成员构造函数



我正在努力理解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()函数并从中复制

最新更新