我正在尝试将一段C ++代码重构为一个类。现在的代码看起来像这样
USB Usb;
ACMAsyncOper AsyncOper;
ACM Acm(&Usb, &AsyncOper);
我想将此代码移到类的构造函数中。我也想将变量
Usb
,AsyncOper
和Acm
作为类的成员变量。我写如下
// 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
的特殊构造。将主体留空,因为没有理由在构造函数中重新创建
Usb
和AsyncOper
数据成员。此外,执行ACM Acm(&Usb, &AsyncOper)
可能会导致未定义行为,因为您正在访问构造函数主体关闭时将超出范围的局部变量的地址。如果您在其他地方使用这些地址,将导致未定义行为。相关:C++ Member Initialization List