2013-07-21 9 views
6

Ich habe einen Beitrag über Named Constructors gelesen. Es hat die benannten Konstruktoren als statisch deklariert. Was kann der Grund dafür sein? Würde nicht eine nicht statische Methode dem gleichen Zweck dienen?Warum statische Konstruktoren genannt werden

+4

Vergiss, dass ein nicht-statischer Konstruktor ein Henne-und-Ei-Problem ist, hast du deinen Artikel gelesen? * Leider sind die Parameter für diese beiden Koordinatensysteme gleich: zwei Floats. Dies würde zu einem Mehrdeutigkeitsfehler in den überladenen Konstruktoren führen. * Vielleicht möchten Sie auch das Fabrikmuster betrachten. –

+0

@ ta.speot.is jetzt habe ich den ganzen Artikel gelesen :) – Saksham

Antwort

14

Eine nicht-statische Funktion mit einem Objekt eines zugeordnet ist Klasse.

In diesem Fall ist der ganze Punkt der Funktion erstellen ein Objekt der Klasse. Wenn Sie die Funktion aufrufen, ist keine Instanz der Klasse, mit der der Funktionsaufruf verknüpft werden konnte.

1

Es ist nicht Teil einer "magischen Syntax". Es ist nur eine statische Mitglied, die als Fabrik für Klasse Punkt funktioniert. Ich werde Beispiel von diesem Link kopieren und fügen Sie erklären Kommentare:

#include <cmath>    // To get std::sin() and std::cos() 

class Point { 
public: 
    static Point rectangular(float x, float y);  // Its a static function that returns Point object 
    static Point polar(float radius, float angle); // Its a static function that returns Point object 
    // These static methods are the so-called "named constructors" 
    ... 
private: 
    Point(float x, float y);  // Rectangular coordinates 
    float x_, y_; 
}; 

inline Point::Point(float x, float y) 
    : x_(x), y_(y) { } 

inline Point Point::rectangular(float x, float y) 
{ return Point(x, y); } //Create new Point object and return it by value 

inline Point Point::polar(float radius, float angle) 
{ return Point(radius*std::cos(angle), radius*std::sin(angle)); } //Create new Point object and return it by value 

So Point::rectangular und Point::polar ist nur eine Fabrik für die Klasse Punkt

+0

Ich bin nicht vertraut mit dieser Verwendung des Wortes * Stoff *. Ich sehe die textile Analogie nicht. Bist du sicher, dass das das richtige Wort ist? –

+0

Fertigung vielleicht, z. B. Fabrik? –

+0

Ja, es Fabrik, tut mir leid;) – PSIAlt

3

Sie müssen static Methoden sein.

class Point { 
public: 
    static Point rectangular(float x, float y);  // Rectangular coord's 
    static Point polar(float radius, float angle); // Polar coordinates 

    ... 
private: 
    Point(); 
    Point(float x, float y);  // Rectangular coordinates 
    float x_, y_; 
}; 

In Named Constructor Idiom Sie Konstrukteuren private oder protected machen sollte, so dass Sie nicht haben ein konstruiertes Objekt in einem geraden Weg.

Auf der anderen Seite müssen static Methoden keine Objekte zum Aufruf haben, also brauchen sie auch keine Konstruktoren.

Daher können Sie static Methoden verwenden, um etwas wie die Rückgabe eines konstruierten Objekts zu tun.

0

Nun, in gewissem Sinne kann es tatsächlich. Benannte Konstruktoren sind das Ergebnis der Zusammenführung einer Factory mit dem Zieltyp. In der ursprünglichen Fabrik-Muster, würden Sie so etwas wie dieses:

class PointFactory { 
public: 
    Point rectangular(float x, float y);  // Rectangular coord's 
    Point polar(float radius, float angle); // Polar coordinates 
    // Of course these *could* be static, but they don't *have* to be. 
private: 
    /* ... */ 
}; 

Wenn alles, was Sie wollen, ist ein Punkt zu erstellen und nicht wirklich eine komplizierte Fabrik Typ benötigen, können Sie einfach die Fabrik-Funktionalität auf den Punkt bewegen tippen Sie sich ein. Dann müßten Sie aus den in den anderen Antworten genannten Gründen die Memberfunktion static zu "Named Constructor" machen.

Verwandte Themen