在C ++中将另一个类作为类成员

时间:2013-06-01 16:50:18

标签: c++ class constructor

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

1 个答案:

答案 0 :(得分:5)

您的构造函数应该通过 member-initializer 列表初始化Acm

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

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

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

相关:C++ Member Initialization List