Wie wird mit dem erforderlichen Standardkonstruktor verfahren?

8

Wenn ich einen Kopierkonstruktor für eine meiner Klassen schreibe (die ein paar Objekte anderer UDTs enthält), muss ich einen Standardkonstruktor für diese UDTs erstellen, obwohl sie nie wirklich dazu gedacht waren.

>

Ist es in Ordnung, einen leeren Standardkonstruktor zu implementieren und damit fertig zu sein? Der Standardkonstruktor wird nur während dieses Kopierens aufgerufen, wenn das Objekt erstellt und dann die Werte des entsprechenden Objekts in das Objekt kopiert werden. Daher werden die Werte, die dem Objekt im Standardkonstruktor zugewiesen werden, niemals tatsächlich verwendet.

Das Problem, das ich sehe, ist, dass einige Membervariablen in einem leeren Standardkonstruktor nicht initialisiert werden. Soll ich nur einen schreiben, der stattdessen Dummy-Werte gibt? Irgendwelche anderen empfohlenen Möglichkeiten, um damit umzugehen?

Edit: Ich verstehe, dass ein Kopierkonstruktor keinen Standardkonstruktor BENÖTIGT, wenn ich Kopierkonstruktoren für die anderen Klassen definieren würde, aber ich tat es nicht, also braucht es es.

    
Anonymous 22.12.2009, 17:06
quelle

11 Antworten

5

Wenn Sie eine Initialisierungsliste im Kopierkonstruktor verwenden, benötigen Sie keinen Standardkonstruktor:

%Vor%

Ergebnisse in:

%Vor%     
mrkj 22.12.2009, 17:21
quelle
4

Sind Sie wirklich sicher, dass Sie einen Kopierkonstruktor benötigen? Es ist ungewöhnlich (aber nicht unmöglich), eine Klasse zu haben, in der der Standardkonstruktor in Ordnung wäre, aber Sie benötigen einen benutzerdefinierten Kopierkonstruktor. Vielleicht könnten Sie den Code für Ihre Klasse veröffentlichen?

    
anon 22.12.2009 17:15
quelle
3

Es klingt für mich so, als müssten Sie Kopierzeichen für die anderen Klassen definieren, da Sie Objekte von ihnen erstellen, indem Sie andere Objekte kopieren.

    
Amir Rachum 22.12.2009 17:20
quelle
2

Sie sagen:

  

wenn das Objekt erstellt wird und dann   die Werte des entsprechenden Objekts   werden darauf kopiert.

Aber fragen Sie sich - wie kommen die Werte dieses "entsprechenden Objekts" überhaupt erst an? I.e. Wie wurde das entsprechende Objekt erstellt?

Diese vorherige SO-Diskussion kann dazu beitragen, die Dinge für Sie zu klären.

    
Eli Bendersky 22.12.2009 17:12
quelle
1

Das klingt nicht nach der besten Möglichkeit, einen Kopierkonstruktor zu implementieren. Wenn die enthaltenen Typen selbst Kopierkonstruktoren zur Verfügung stellen, benutzen Sie diese. Es gibt möglicherweise einen Grund, warum ein Typ keinen Standardkonstruktor bereitstellt.

    
Nikolai Fetissov 22.12.2009 17:15
quelle
1

Ich würde zuerst fragen, warum das Kopieren dieser UDTs den Standard -Konstruktor und nicht den passenderen -Kopier -Konstruktor beinhaltet. Ich würde auch fragen, was es für ein Objekt bedeutet, im default initialisierten Zustand zu sein - wenn es etwas bedeutet, dann implementieren Sie es auf jeden Fall.

Wenn Sie keine sinnvolle Bedeutung für eine Standardinitialisierung haben und Sie das Objekt unbedingt mit einem Standardkonstruktor definieren müssen, könnte die Implementierung eines Standardkonstruktors möglich sein.

Allerdings können nicht alle Objekte einen Standardkonstruktor erhalten, daher ist es immer noch eine gute Idee, die Ursache des Problems zu beheben.

    
Victor Nicollet 22.12.2009 17:16
quelle
0

Sie können den Standardkonstruktor verhindern, indem das andere Objekt auch Kopierkonstruktoren benötigt (Oder verwenden Sie einen speziellen Konstruktor, der alle Informationen zum Konstruieren der Objekte enthält. Im Allgemeinen hat der Standardkonstruktor, der nicht alle Elementvariablen initialisiert, ein sehr schlechte Idee.Mindestens stellen Sie sicher, dass die Standardkonstruktoren der anderen Klasse alle Mitglieder initialisiert.

    
Jim Kramer 22.12.2009 17:18
quelle
0

Wenn Sie nicht möchten, dass der Compiler einen Kopierkonstruktor generiert oder überhaupt einen Kopierkonstruktor, dann deklarieren Sie einen privaten Kopierkonstruktor, aber geben Sie keine Definition (Code) dafür an. Der Compiler sieht die Deklarationen und generiert keine. Tun Sie dies auch mit dem Zuweisungsoperator.

Ich mache das mit meinen Singleton-Klassen.

    
Thomas Matthews 22.12.2009 17:23
quelle
0

Wenn Ihre Klasse nicht standardmäßig erstellt werden soll, erstellen Sie keinen Standardkonstruktor. Wenn das der Fall ist, dann können Sie sicher eine vernünftige Initialisierung finden, also sollten Sie das verwenden.

    
rmn 22.12.2009 17:24
quelle
0

Merken Sie sich eine Daumenregel, die, soweit etwas nicht Teil der Spezifikation ist, vom Compiler nicht für Sie erledigt wird.

Wenn Ihre Klasse einen benutzerdefinierten Typ enthält und wenn Sie ein Objekt daraus erstellen, muss der Compiler für jedes Objekt den Standardbaustein aufrufen.

Aber Datenelemente von Objekten zu initialisieren ist keine Aufgabe von Compier, aber Sie sollten es tun.

Für den von Ihnen erwähnten Fall benötigen Sie einen eigenen Konstruktor und Zuweisungsoperator für benutzerdefinierte Kopien.

    
Ashish 22.12.2009 17:21
quelle
0

Die Frage, wie Sie es formulierten, scheint keinen Sinn zu ergeben. Copy-constructor benötigt den Standardkonstruktor nicht, wie Sie zu glauben scheinen. Copy-Constructor ist ein vollständig unabhängiger vollwertiger Konstruktor, der ein Objekt komplett selbst erstellt.

Wenn Sie Ihre Objekte mit copy-constructor erstellen, brauchen Sie keine Standardobjekte. Wenn Sie Ihre Objekte mit dem Standardkonstruktor erstellen, können Sie den Kopierkonstruktor nicht für sie verwenden. Es ist nicht möglich, zwei verschiedene Konstruktoren auf dasselbe Objekt anzuwenden.

Wenn Sie Ihre Objekte auf beide Arten konstruieren, werden sie zu zwei völlig unabhängigen Konstruktoren, von denen jeder seinen eigenen unabhängigen Zweck hat. In diesem Fall sollten Sie sich die Frage stellen, wie Sie wollen, dass Ihre Objekte default-konstruiert werden. Nur du weißt das.

Auch hier müssen Sie Ihre Frage klären. Ich würde vermuten (aus Ihrer Beschreibung), dass vielleicht das, was Sie zu implementieren versuchen, kein Kopierkonstruktor ist, sondern ein Kopierzuweisungsoperator. Aber das ist nur eine wilde Vermutung.

    
AnT 22.12.2009 17:29
quelle

Tags und Links