我正在通過C++的介紹工作,我有一個涉及使用複製構造函數的問題。 練習的想法是構建一個電話對象,它本身構成一個房屋,一根電纜,一個撥號器和一個耳機。這一切都非常有效,並且具有啓發性,因爲每個類在被調用時都會給出一個cout,但是當我嘗試以下操作時會出現問題。問題複製構造一個動態分配的對象
該撥號器構造了12個按鈕的數組。按鈕級看起來如下:
class Button {
public:
Button() { std::cout << "Button Constructor " << this << std::endl ; }
Button(const Button&) { std::cout << "Button Copy Constructor " << this << std::endl ; }
~Button() { std::cout << "Button Destructor " << this << std::endl ; }
private:
} ;
我在撥號程序類的第一槍使用靜態分配的按鈕,並且效果很好。代碼:
class Dialer {
public:
Dialer() { std::cout << "Dialer Constructor " << this << std::endl ; }
Dialer(const Dialer &dialer) : buttons(dialer.buttons) { std::cout << "Dialer Copy Constructor " << this << std::endl ; }
~Dialer() { std::cout << "Dialer Destructor " << this << std::endl ; }
private:
Button buttons[12] ;
} ;
練習中的下一步是動態分配按鈕,這就是樂趣開始的地方。以下一段代碼的作品:
class Dialer {
public:
Dialer() : buttons(new Button[12]) { std::cout << "Dialer Constructor " << this << std::endl ; }
Dialer(const Dialer &dialer) {
buttons = new Button[12];
std::cout << "Dialer Copy Constructor " << this << std::endl ;
}
~Dialer() {
delete[] buttons;
std::cout << "Dialer Destructor " << this << std::endl ;
}
private:
Button* buttons ;
} ;
但當然這不會調用Button複製構造函數。我試過很多東西:
buttons = new Button(dialer.buttons)[12];
buttons = new Button(dialer.*buttons)[12];
*buttons = dialer.*buttons;
但我只是不能解決它。所有這些嘗試都給出了在Button類中沒有定義匹配函數的錯誤。
我希望得到任何幫助:)
乾杯, GeneralDuke
感謝您的快速回答。如果我實現您的提案,它仍然調用Button構造函數,而不是Button複製構造函數。我認爲其中哪一個被調用沒有太大區別,但是練習狀態Dialer應該調用複製構造函數。任何想法如何實現這一目標? – GeneralDuke 2015-02-10 09:08:52
編輯爲使用按價值傳遞。在通過值返回或傳遞一些對象時,通常會使用複製構造函數。 – MichaelCMS 2015-02-10 09:41:03
首先,構造函數12次調用12次(因爲buttons = new Button [12];)。接下來,確實複製構造函數被調用,但之後立即被破壞。我不認爲這也是解決方案... 此外,練習並沒有提到我應該引入一些新的功能。它只是聲明「修改構造函數,析構函數和複製構造函數以實現此更改」 – GeneralDuke 2015-02-10 09:48:27