在C+中有另一个类作为类成员+; 我试图把一段C++代码重构成一个类。现在代码是这样的 USB Usb; ACMAsyncOper AsyncOper; ACM Acm(&Usb, &AsyncOper);
我想将此代码移动到类的构造函数中。另外,我希望将变量在C+中有另一个类作为类成员+; 我试图把一段C++代码重构成一个类。现在代码是这样的 USB Usb; ACMAsyncOper AsyncOper; ACM Acm(&Usb, &AsyncOper);,c++,class,constructor,C++,Class,Constructor,我想将此代码移动到类的构造函数中。另外,我希望将变量Usb、AsyncOper和Acm作为类的成员变量 我是这样写的 // eZ430.h class eZ430 { public: eZ430(); private: USB Usb; ACMAsyncOper AsyncOper; ACM Acm; }; // eZ430.cpp #include "eZ430.h" eZ430::eZ430()
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:在“&”标记之前预期的标识符
当我把它改成
eZ430::eZ430() {
USB Usb;
ACMAsyncOper AsyncOper;
ACM Acm(&Usb, &AsyncOper);
}
我得到一个错误,调用“ACM::ACM()”时没有匹配的函数。您的构造函数应该通过其成员初始值设定项列表初始化
ACM
:
我们这样做是因为ACM
没有默认构造函数,我们必须确保eZ430
的默认构造导致ACM
的专门构造
并将主体留空,因为没有理由在构造函数中重新创建Usb
和AsyncOper
数据成员。此外,执行ACM-ACM(&Usb,&AsyncOper)
可能会导致未定义的行为,因为您正在访问局部变量的地址,这些地址在构造函数主体关闭时将超出范围。如果在其他地方使用这些地址,将导致未定义的行为
相关:您的构造函数应通过其成员初始值设定项列表初始化
Acm
:
我们这样做是因为ACM
没有默认构造函数,我们必须确保eZ430
的默认构造导致ACM
的专门构造
并将主体留空,因为没有理由在构造函数中重新创建Usb
和AsyncOper
数据成员。此外,执行ACM-ACM(&Usb,&AsyncOper)
可能会导致未定义的行为,因为您正在访问局部变量的地址,这些地址在构造函数主体关闭时将超出范围。如果在其他地方使用这些地址,将导致未定义的行为
相关:您是否收到任何错误?告诉我们它们是什么。你想做的事情——将对象作为另一个类的成员变量——通常是可能的,但可能涉及到的类中有一些东西使它无法工作。另外,您绝对不应该在构造函数中将所有数据成员重新声明为局部变量。@0x499602D2用我得到的错误更新了问题。您得到任何错误吗?告诉我们它们是什么。你想做的事情——将对象作为另一个类的成员变量——通常是可能的,但可能涉及到的类中有一些东西使它无法工作。另外,您绝对不应该将所有数据成员重新声明为构造函数中的局部变量。@0x499602D2用我得到的错误更新了问题。为了进一步说明,我猜Acm没有默认构造函数。这就是为什么成员初始值设定项是必要的。不仅没有理由在构造函数中重新创建数据成员,而且它实际上是错误的:数据成员最终被默认初始化,或者更糟糕的是,被指向立即超出范围的局部数的指针初始化,从而武装起一个未定义的行为炸弹,我猜INT Acm没有默认构造函数。这就是为什么成员初始值设定项是必要的。不仅没有理由在构造函数中重新创建数据成员,而且它实际上是错误的:数据成员最终被默认初始化,或者更糟糕的是,初始化时使用指向立即超出范围的局部变量的指针,从而触发了一个未定义的行为炸弹。
eZ430() : Acm(&Usb, &AsyncOper)
{}