0

我正在尝试将一段 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()'

4

1 回答 1

5

您的构造函数应Acm通过其成员初始化器列表进行初始化:

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

我们这样做是因为ACM没有默认构造函数,并且我们必须确保默认构造eZ430会导致Acm.

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

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

于 2013-06-01T16:52:36.233 回答