Kann ich einen Konstruktor von einem anderen Konstruktor (do constructor chaining) in C ++ aufrufen?
Als C# Entwickler, die ich gewohnt bin zu laufen, durch Konstruktoren:
class Test {
public Test() {
DoSomething();
}
public Test(int count) : this() {
DoSomethingWithCount(count);
}
public Test(int count, string name) : this(count) {
DoSomethingWithName(name);
}
}
Gibt es eine Möglichkeit in C++?
Ich habe versucht, den Namen der Klasse und die Verwendung der "this" - Schlüsselwort, aber beides schlägt fehl.
InformationsquelleAutor der Frage Stormenet | 2008-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++11: Ja!
C++11-und weiter hat dieser selbe feature (genannt delegierende Konstruktoren).
Die syntax unterscheidet sich etwas von C#:
C++ - 03: Keine
Leider gibt es keine Möglichkeit, dies zu tun in C++03, aber es gibt zwei Arten der Simulation:
Können Sie kombinieren zwei (oder mehrere) Konstruktoren per default Parameter:
Nutzen Sie eine init-Methode, um gemeinsamen code:
Sehen der C++ - FAQ-Eintrag für Referenz.
InformationsquelleAutor der Antwort JohnIdol
Nein, Sie können nicht aufrufen eines Konstruktors aus einem anderen in C++03 (eine so genannte delegierende Konstruktor).
Änderte sich dies in C++11 (aka C++0x), die Unterstützung für die folgende syntax:
(Beispiel entnommen aus Wikipedia)
InformationsquelleAutor der Antwort Cyrille Ka
Ich glaube, Sie können rufen Sie einen Konstruktor aus einem Konstruktor. Es wird kompiliert und ausgeführt. Vor kurzem sah ich jemanden, dies zu tun und es lief auf Windows und Linux.
Es einfach nicht tun, was Sie wollen. Die innere Konstruktor konstruieren ein lokales temporäres Objekt, das gelöscht wird, sobald die äußeren Konstruktor gibt. Werden, müssten Sie verschiedene Konstruktoren, wie gut oder erstellen Sie einen rekursiven Aufruf.
Ref: https://isocpp.org/wiki/faq/ctors#init-methods
InformationsquelleAutor der Antwort ohlemacher
Es ist darauf hinzuweisen, dass Sie kann Aufruf des Konstruktors der Elternklasse im Konstruktor z.B.:
Aber, Nein, das können Sie nicht, rufen Sie einen anderen Konstruktor der gleichen Klasse.
InformationsquelleAutor der Antwort kchoose2
In C++11ein Konstruktor kann einen anderen Konstruktor aufrufen überlastung:
Zusätzlich können Mitglieder werden initialisiert, wie dies auch.
Sollte dies die Notwendigkeit beseitigen, die zum erstellen der Initialisierung Helfer-Methode. Und es ist immer noch empfohlen, nicht durch Aufruf einer virtuelle Funktionen in Konstruktoren oder Destruktoren zu vermeiden, mit allen Mitgliedern, die möglicherweise nicht initialisiert werden.
InformationsquelleAutor der Antwort Ben L
Wenn Sie wollen, böse zu sein, können Sie die in-place "new" - operator:
Scheint zu funktionieren für mich.
Bearbeiten
Als @ElvedinHamzagic Punkte aus, wenn Foo enthalten ein Objekt zugewiesenen Speicher, das Objekt kann nicht freigegeben werden. Dies verkompliziert die Dinge weiter.
Ein mehr Allgemeines Beispiel:
Sieht ein bisschen weniger elegant, das ist sicher. @JohnIdol die Lösung ist viel besser.
InformationsquelleAutor der Antwort lyngvi
Nein, in C++ können Sie nicht aufrufen eines Konstruktors aus einem Konstruktor. Was Sie tun können, als warren darauf hingewiesen, ist:
Beachten Sie, dass im ersten Fall, können Sie nicht reduzieren, code-Duplizierung, die durch den Aufruf eines Konstruktors aus einem anderen. Sie können natürlich eine eigene, private/protected-Methode, die macht die ganze Initialisierung, und lassen Sie den Konstruktor befassen sich hauptsächlich mit der Behandlung von Argumenten.
InformationsquelleAutor der Antwort unwind
In Visual C++ können Sie auch diese notation innerhalb Konstruktor: this->Classname::Classname(Parameter, die von anderen Konstruktor). Ein Beispiel finden Sie unten:
Ich weiß nicht, ob es funktioniert woanders, ich habe nur getestet in Visual C++ 2003 und 2008. Sie können auch anrufen mehrere Konstruktoren diese Weise, nehme ich an, genau wie in Java und C#.
P. S.: Ehrlich gesagt, war ich überrascht, dass dies nicht erwähnt.
InformationsquelleAutor der Antwort izogfif
Wenn ich verstehe deine Frage richtig, du bist gefragt, wenn Sie anrufen können mehrere Konstruktoren in C++?
Wenn es das ist, was Sie suchen, dann Nein - das ist nicht möglich.
Können Sie in der Tat haben mehrere Konstruktoren, die jeweils mit einzigartigen argument Unterschriften, und dann rufen Sie die, die Sie wollen, wenn Sie instanziieren ein neues Objekt.
Können Sie sich auch ein Konstruktor mit ausgefallenen Argumenten am Ende.
Aber man kann nicht mehrere Konstruktoren, und rufen Sie dann jede von Ihnen separat.
InformationsquelleAutor der Antwort warren
Andere option, dass ist nicht gezeigt worden noch ist, teilen Sie Ihre Klasse in zwei -, Wickel-ein leichtes interface-Klasse um Ihre ursprüngliche Klasse zu erreichen, um den Effekt, den Sie suchen:
Könnte dies ein Durcheinander, wenn Sie viele Konstruktoren, die rufen "das nächste level-up" Pendant, aber für eine Handvoll Konstruktoren, sollte es handhabbar sein.
InformationsquelleAutor der Antwort e.James
Ich würde vorschlagen, die Verwendung eines
private friend
Methode, die implementiert die Anwendungslogik des Konstruktors und der sogenannte von den verschiedenen Konstruktoren. Hier ist ein Beispiel:Angenommen, wir haben eine Klasse namens
StreamArrayReader
mit einige private Felder:Und wollen wir definieren zwei Konstruktoren:
Wo der zweite macht einfach Gebrauch von der ersten (und wir natürlich nicht wollen, duplizieren Sie die Umsetzung der ehemaligen). Im Idealfall würde man etwas tun, wie:
Dies ist jedoch nicht erlaubt in C++. Aus diesem Grund können wir definieren ein eigenes Freund-Methode wie folgt implementiert, was der erste Konstruktor soll das tun:
Nun diese Methode (weil es ein Freund) hat Zugriff auf die privaten Felder
o
. Dann, der erste Konstruktor wird:Beachten Sie, dass diese nicht erstellen Sie mehrere Kopien für die neu erstellte kopiert. Der zweite wird:
Ist, anstatt ein Konstruktor ruft einen anderen, beide nennen ein eigenes Freund!
InformationsquelleAutor der Antwort Pantelis Sopasakis
Dieser Ansatz kann die Arbeit für einige Arten von Klassen (wenn der Zuweisungsoperator verhält sich 'gut'):
InformationsquelleAutor der Antwort V15I0N
Beim Aufruf eines Konstruktors es tatsächlich Speicher reserviert, entweder aus dem stack oder auf dem heap. So ruft ein Konstruktor in einem anderen Konstruktor erzeugt eine lokale Kopie. So verändern wir ein anderes Objekt, nicht die, die wir fokussieren uns auf.
InformationsquelleAutor der Antwort XPD
Einfach ausgedrückt, Sie können nicht vor C++11.
C++11 führt delegierende Konstruktoren:
Beachten Sie, dass eine delegierende Konstruktor ist eine alles-oder-nichts-Vorschlag; falls ein Konstruktor Delegierten, um einen anderen Konstruktor, der aufrufende Konstruktor nicht erlaubt ist, haben andere Mitglieder in der Initialisierung der Liste. Dies macht Sinn, wenn Sie denken, zum initialisieren von const/reference Mitglieder einmal und nur einmal.
InformationsquelleAutor der Antwort
Wäre einfacher zu testen, als zu entscheiden 🙂
Versuchen Sie dies:
und kompilieren Sie es mit 98 std:
g++ main.cpp -std=c++98 -o test_1
sehen Sie:
so 🙂
InformationsquelleAutor der Antwort gyula