2016-11-16 10 views
-2

Я новичок в C++ и хотел бы знать, если это возможно, чтобы сделать что-то вроде этого:Возможно ли построить объект непосредственно в аргументах другого конструктора в C++?

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

Идея заключается в том, что прямоугольник принимает объект точки, а также ширина и высота параметры. Конструкторы выглядеть следующим образом:

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

Take по значению и первому должно сработать. – tkausl

+0

По какой-то причине я думал, что «точка» выходит за рамки. Я был неправ. – tkausl

ответ

2

«обычный» ссылка не может связываться с временным, только постоянной ссылки (const T&) и г-значения-ссылки (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; 
} 

, который позволит ему принять временный (как вы хотите) или возьмите lvalue (это то, что делает ваш второй пример).

Если Rectangle предназначено для хранения ссылки , это почти наверняка ошибка дизайна, и вы должны это изменить.

+0

Не используйте назначения в конструкторе. Используйте список инициализации. –

0

Вы можете создать экземпляр в своем списке аргументов, но у вас не было бы точки, доступной вне конструктора. Точка была бы локальной конструктором.

После этого вы можете получить доступ к точке как rect.point.

Edit:

Поскольку вы пытаетесь использовать ссылку на точку, это не будет работать.

 Смежные вопросы

  • Нет связанных вопросов^_^