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
Antwort
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.
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
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? –
Fertigung vielleicht, z. B. Fabrik? –
Ja, es Fabrik, tut mir leid;) – PSIAlt
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.
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.
- 1. Warum statische Konstruktoren genannt werden
- 2. Warum brauchen wir statische Konstruktoren?
- 3. Statische Konstruktoren und BeforeFieldInit?
- 4. Warum werden Strings "Strings" genannt?
- 5. Warum werden Assistentendialoge "Assistenten" genannt?
- 6. Statische Importe und Konstruktoren
- 7. Versuchen, statische Konstruktoren zu verstehen
- 8. Wie können statische Konstruktoren nicht privat gemacht werden?
- 9. Warum müssen Regex-Konstruktoren doppelt maskiert werden?
- 10. Warum sollten Membervariablen in Konstruktoren initialisiert werden?
- 11. Statische Konstruktoren verursachen einen Leistungs-Overhead?
- 12. Warum werden Threads Lightweight-Prozesse genannt?
- 13. Warum werden sie die "Viererbande" genannt?
- 14. Warum werden einige Dateien "www" genannt?
- 15. Warum werden reguläre Ausdrücke "reguläre" Ausdrücke genannt?
- 16. Warum werden deterministische Profiler 'deterministisch' genannt?
- 17. Warum Java Bohnen Bohnen genannt werden?
- 18. Warum werden Signale nicht einfach Ereignisse genannt?
- 19. Warum werden statische Klassen verwendet?
- 20. Was genau sind statische Konstruktoren in C#?
- 21. Private vs Statische Konstruktoren in. Net
- 22. Wo werden virtuelle Konstruktoren verwendet?
- 23. Seltsames Verhalten von statischen Konstruktoren
- 24. Warum wird RAII so genannt?
- 25. Warum Dateibereich statische Variablen müssen initialisiert werden?
- 26. Warum werden Inner Join und Outer Join so genannt?
- 27. Warum Konstruktoren diesen Zeiger "zurückgeben"?
- 28. Warum asp.net MVC Leichtgewicht genannt?
- 29. Warum ist onPeersAvailable oft genannt
- 30. Warum können wir keine ausdrucksbasierten Konstruktoren verwenden?
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. –
@ ta.speot.is jetzt habe ich den ganzen Artikel gelesen :) – Saksham