Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在类中具有类对象_C++ - Fatal编程技术网

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端口上,关系重大。否则,答案是什么