2016-11-16 3 views
-2

Ich bin sehr neu in C++ und würde gerne wissen, ob es möglich ist, so etwas zu tun:Ist es möglich, ein Objekt direkt in den Argumenten eines anderen Konstruktors in C++ zu konstruieren?

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

Die Idee ist, dass Rechteck ein Point-Objekt sowie Breite und Höhe Parameter nimmt. Die Konstrukteure sehen wie folgt aus:

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; 
}; 

ich, indem Sie diese den gewünschten Effekt zu erreichen:

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

aber ich denke, es wäre schön, wenn ich mein Punkt direkt für eine neue in den Argumenten instanziiert könnte Rechteck. Wenn dies möglich ist, lass es mich wissen! Vielen Dank!

+2

macht es ein 'const Point & Point' – GeorgeAl

+0

Nehmen von Wert und dem ersten sollte arbeiten. – tkausl

+0

Aus irgendeinem Grund dachte ich, "Punkt" geht aus dem Rahmen. Ich habe mich geirrt. – tkausl

Antwort

2

eine "reguläre" Bezugnahme auf eine zeitlich begrenzt, nicht nur konstante Referenz binden kann (const T&) und r-Wert-reference (T&&)

in Ihrem ersten Schnipsel ist Point(0, 0) ein temporäre, so kann es nicht sein, gebunden an Point&, aber in Ihrem zweiten Schnipsel, Point point(0, 0); ist keine temporäre, so dass es funktioniert.

in diesem Fall, da Sie die temporären zu ändern versuchen Sie nicht, es zu einer konstanten Referenz machen binden:

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

Aber wenn ich ein Objekt, das ich vorher definiert habe, wie in meinem zweiten Beispiel weitergeben werde, wird mein Objekt dann zweimal gespeichert? – Frank

+0

sollten Sie über Bereiche in C++ zu lesen. –

+0

Ich bin dabei zu lernen so viel wie ich kann, aber gelegentlich bin ich ratlos. Aber interessanterweise (zumindest für mich) Wenn ich die Methode in Ihrer Antwort und in meinem zweiten Beispiel verwende, bekomme ich zwei getrennte Objekte statt einer, was ziemlich nett ist. – Frank

0

Es hängt davon ab, wie Rectangle definiert ist.

Ich nehme an, es so etwas wie folgt aussieht:

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

In diesem Fall definieren die Constructor wie dies funktioniert:

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

die es erlauben, wird es eine vorübergehende zu nehmen (wie Sie wollen) oder nehmen Sie einen Lvalue (was ist Ihr zweites Beispiel).

Wenn Rectangle eine Referenz zu einem Punkt speichern soll, ist das fast sicher ein Designfehler, und Sie sollten das ändern.

+0

Verwenden Sie keine Zuweisungen im Konstruktor. Verwenden Sie eine Initialisierungsliste. –

0

Sie können möglicherweise in Ihrer Argumentliste instanziieren, aber Sie hätten den Punkt außerhalb des Konstruktors nicht verfügbar. Der Punkt wäre lokal für den Konstruktor.

Sie könnten den Punkt danach als rect.point zugreifen.

Edit:

Da Sie einen Verweis auf Punkt zu verwenden versuchen, wird dies nicht funktionieren.

Verwandte Themen