2014-12-13 66 views
3

我有以下類別:這是爲什麼發生?運算符=和拷貝構造函數

class CRectangle 
{ 
    CRectangle(string color); 
    CRectangle(CRectangle &origin); 
    /* Some more code */ 
}; 

和這個其他:

class CPlane 
{ 
    /* Some more code */ 
    CRectangle boundingBox(); 
}; 

爲什麼我能做到這一點? :

CRectangle rectangle1; 
CRectangle rectangle2=rectangle1; 
CRectangle rectangle3(rectangle1); //Copy constructor. 

但我不能這樣做:

CPlane plane; 
CRectangle rectangle4=plane.boundingBox(); 
CRectangle rectangle5(plane.boundingBox()); //Copy constructor. 

如果我需要我的最後一個工作,我該怎麼辦呢?我想這可能與運營商=有關,但我不完全清楚。

編輯:修復複製構造函數。錯誤仍然存​​在。

+2

您的副本構造函數會導致無限遞歸(複製導致副本導致副本......) – juanchopanza 2014-12-13 15:48:10

+0

對於副本構造函數,您應該將參數作爲const引用。 – Cornstalks 2014-12-13 15:48:19

+1

作爲未來的提示,當某些事情「不起作用」時,請包括**什麼都行不通**,I.E.來自編譯器/運行時錯誤的文本或實際輸出與預期輸出。 – aruisdante 2014-12-13 15:52:56

回答

3

您不能將右值與非const左值引用綁定。

CRectangle rectangle3(rectangle1); 

這裏rectangle1是非const左值,所以這是很好。

CRectangle rectangle5(plane.boundingBox()); 

plane.boundingBox()是一個純粹的右值(prvalue),所以CRectangle&不能綁定到它。

相反的聲明拷貝構造函數採取const參考:

CRectangle(CRectangle const&); 

或附加聲明一個移動構造函數(如果需要)。

+0

我在看這個:http://www.cplusplus.com/articles/y8hv0pDG/我認爲CRectangle(CRectangle起源)是一個正確的拷貝構造函數。 – IzonFreak 2014-12-13 16:13:39

+0

@IzonFreak什麼!?他明確地說「或者**我個人最喜歡的方式來創建C++ **中的無限循環:」。 – Columbo 2014-12-13 16:17:39

+0

我只是檢查我的代碼,我確實有CRectangle(CRectangle&origin);這只是一個錯誤在做這個職位。 – IzonFreak 2014-12-13 16:32:25

5

複製構造函數請求編譯器的第一種語法,用於無限遞歸。

它應該是: -

CRectangle(const CRectangle& origin); 

其次,兩者都要求應該都是調用拷貝constrcutor正常工作。

CRectangle rectangle4=plane.boundingBox(); 
CRectangle rectangle5(plane.boundingBox()); 
+0

「請求編譯器進行無限遞歸」,是的,但首先它要求編譯器提供錯誤診斷,因爲該聲明是無效的。我懷疑OP沒有發佈實際的代碼。否則,他或她正在使用一些非常古老或奇怪的編譯器。 – 2014-12-13 15:57:31

+0

@ Cheersandhth.-Alf im using eclipse Luna,and im using real code,I make it work by this:CRectangle box(「azul」);盒= plano.boundingBox( 「」, 「」);但我想嘗試第二種方法,但它不會讓我。 – IzonFreak 2014-12-13 16:06:45

+0

@IzonFreak:Eclipse是一個IDE,而不是編譯器。通常在eclipse中使用g ++或clang。我猜想,如果該聲明編譯,那麼它必須是一些非常舊的版本。 – 2014-12-13 16:19:46

相關問題