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

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


我想将此代码移到类的构造函数中。我也想将变量UsbAsyncOperAcm作为类的成员变量。

我写如下

// 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++ Member Initialization List

09-18 09:41