2016-11-16 98 views
-2

我很新的C++,並想知道是否有可能做這樣的事情:是否有可能直接在C++中的另一個構造函數的參數中構造一個對象?

Rectangle rect(Point(0, 0), 10, 10); // doesn't work 

的想法是,矩形採用Point對象以及寬度和高度參數。該構造是這樣的:

Rectangle::Rectangle(Point & point, double width, double height) { 
    this->point = point; 
    this->width = width; 
    this->height = height; 
}; 

Point::Point(double x, double y) { 
    this->x = x; 
    this->y = y; 
}; 

我可以這樣得到預期的效果:

Point point(0, 0); 
Rectangle rect(point, 10, 10); // this works 

,但我認爲這將是很好,如果我能在參數直接實例我點新長方形。如果這是可能的,請讓我知道!謝謝!

+2

通過價值使它成爲'常量點和point' – GeorgeAl

+0

走,第一個應該管用。 – tkausl

+0

出於某種原因,我認爲'point'超出了範圍。我錯了。 – tkausl

回答

2

「常規」參考不能結合到一個臨時的,僅恆定的基準(const T&)和r值,參考(T&&

在第一片斷

Point(0, 0)是暫時的,因此它不能被綁定到Point&,但在你的第二個片段中,Point point(0, 0);不是一個臨時的,所以它的工作原理。

在這種情況下,你不要試圖修改臨時,使得其綁定到一個恆定的參考:

Rectangle::Rectangle(const Point & point, double width, double height) 
+0

但是如果我傳入一個我之前定義的對象,就像在第二個示例中一樣,我的對象是否會被存儲兩次? – Frank

+0

你應該閱讀關於C++中的示波器.. –

+0

我正在學習儘可能多的過程,但我偶爾會陷入困境。但有趣的是(至少對我來說)如果我在你的答案和第二個例子中使用該方法,我會得到兩個單獨的對象,而不是一個,這非常好。 – Frank

0

這取決於如何定義Rectangle

我假設它看起來是這樣的:

class Rectangle { 
    Point point; 
    double width, height; 
    /*...*/ 
}; 

在這種情況下,定義構造函數像這樣將工作:

Rectangle::Rectangle(Point const& p, double w, double h) { 
    point = p; 
    width = w; 
    height = h; 
} 

這將允許其採取臨時(如你想要的)還是採取左值(這是你的第二個例子)。

如果Rectangle是爲了存儲參考到一個點,這幾乎肯定是一個設計錯誤,你應該改變這一點。

+0

不要在構造函數中使用賦值。使用初始化列表。 –

0

你可能可以在你的參數列表中實例化,但是你不會在構造函數外有Point。這一點對構造函數來說是本地的。

之後您可以作爲rect.point訪問該點。

編輯:

既然你要使用到地點的基準,這是不行的。

相關問題