2013-06-01 37 views
0

我正在嘗試將一段C++代碼重構爲類。現在代碼看起來像這樣在C++中擁有另一個類作爲類成員

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

我想將此代碼移入類的構造函數。另外我想要變量Usb,AsyncOperAcm作爲類的成員變量。

我寫爲下面

// 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

您是否收到任何錯誤?告訴我們他們是什麼。 – 0x499602D2

+0

你想做什麼 - 將對象作爲另一個類的成員變量 - 通常*是可能的,但可能有關於所涉及的類的事情使它無法工作。另外,絕對不應該在構造函數中將所有數據成員重新聲明爲局部變量。 – zwol

+0

@ 0x499602D2更新了我收到的錯誤的問題。 – Sudar

回答

5

你的構造應該初始化Acm通過其成員初始化列表

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

我們這樣做是因爲ACM沒有一個默認的構造函數,我們必須確保的eZ430默認施工引起的專業化Acm的建設。

由於沒有理由在構造函數中重新創建UsbAsyncOper數據成員,因此請將其留空。此外,執行ACM Acm(&Usb, &AsyncOper)可能會導致未定義行爲,因爲您正在訪問構造函數體關閉時將超出範圍的局部變量的地址。如果您在其他地方使用那些會導致未定義行爲的地址。

相關:C++ Member Initialization List

+0

爲了進一步闡述,我猜測Acm沒有默認的構造函數。這就是爲什麼成員初始化器是必需的。 – Lance

+0

@蘭斯是的,我更新了。 – 0x499602D2

+0

拍!當您的編輯出現時,我點擊「添加評論」! – Lance

相關問題