在c++中拥有另一个类作为类成员

Having another class as a class member in C++

本文关键字:成员 另一个 c++ 拥有      更新时间:2023-10-16

我正在尝试将一段c++代码重构成一个类。现在代码看起来像这样

USB Usb;
ACMAsyncOper AsyncOper;
ACM Acm(&Usb, &AsyncOper);

我想把这段代码移到类的构造函数中。我还想让变量Usb, AsyncOperAcm作为类的成员变量。

我把它写成如下

// eZ430.h
class eZ430
{
    public:
        eZ430();    
    private:
        USB Usb;
        ACMAsyncOper AsyncOper;
        ACM Acm;
};

// eZ430.cpp
#include "eZ430.h"
eZ430::eZ430() {
    USB Usb;
    ACMAsyncOper AsyncOper;
    ACM Acm(&Usb, &AsyncOper);
}

但这似乎不起作用。我对c++非常陌生,不能让它工作。

请让我知道如何实现它。谢谢。

编辑:当我在构造函数

中有以下代码时
eZ430::eZ430() {
    USB Usb;
    ACMAsyncOper AsyncOper;
    ACM Acm(&Usb, &AsyncOper);
}

我得到错误error: expected identifier before '&' token

当我把它改成

eZ430::eZ430() {
    USB Usb;
    ACMAsyncOper AsyncOper;
    ACM Acm(&Usb, &AsyncOper);
}
我得到错误no matching function for call to 'ACM::ACM()'

构造函数应该通过成员初始化器列表初始化Acm:

eZ430() : Acm(&Usb, &AsyncOper)
{}

这样做是因为ACM没有默认构造函数,我们必须确保eZ430的默认构造函数导致Acm的专用构造函数。

并保留主体为空,因为没有理由在构造函数中重新创建UsbAsyncOper数据成员。此外,执行ACM Acm(&Usb, &AsyncOper)可能会导致未定义行为,因为您正在访问局部变量的地址,这些地址将在构造函数体关闭时超出作用域。如果你在其他地方使用这些地址,将会导致未定义行为。

相关:c++成员初始化列表

相关文章: