2016-11-16 75 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访问该点。

编辑:

既然你要使用到地点的基准,这是不行的。

相关问题