ERLEDIGT
JA
JA
ANTWORTEN
16
16
ZUGRIFFE
351
351
EMPFEHLEN
-
Guten Tag,
und zwar hab ich mal ne Frage. Ich schreib erstmal den Programmausschnitt auf:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
void print_val(Buchung, buchung_val) { buchung_val.info(); } void print_ref(Buchung, buchung_ref) { buchung_ref.info(); } void main() { Buchung mittagessen; Buchung getraenk(1.1, "Cola"); mittagessen = mensa; print_val(mittagessen); print_ref(getraenk); Buchung* inst1 = new Buchung(1,"Foo"); Buchung* inst2 = new Ueberweisung(); inst1->info(); inst2->info(); delete(inst1); delete(inst2); }
Und zwar hab ich jetzt die Frage was denn der Destruktor, Kopierkonstruktor und der Zuweisungsoperator ist****..
-
Hi
Zuerst einmal: Der Beistrich nach Buchung bei print_ref/print_val gehört weg.
Dann...ist print_val zwar in Ordnung (bekommt die Variable als Wert/Value),
aber print_ref soll dann wohl eine Referenz bekommen? Da fehlt nach Buchung ein &:
Code cpp:1 2 3 4 5 6 7
void print_val(Buchung buchung_val) { buchung_val.info(); } void print_ref(Buchung& buchung_ref) { buchung_ref.info(); }
Zur Hauptfrage: Wo Konstruktor, CC, Dest. und =-Op sind, kann ich so auch nicht sagen,
da du Buchung nicht zeigst.
Oder willst du wissen, welche Zeilen im main was davon verwenden?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
also ich kann es dir per PM schicken wenn du magst.
ich denk mal der CC ist :
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
void main() { Buchung mittagessen; Buchung getraenk(1.1, "Cola"); Buchung mensa = getraenk; [COLOR="seagreen"]//Kopierkonstruktor[/COLOR] mittagessen = mensa; [COLOR="seagreen"]//Kopierkonstruktor[/COLOR] print_val(mittagessen); print_ref(getraenk); Buchung* inst1 = new Buchung(1,"Foo"); Buchung* inst2 = new Ueberweisung(); inst1->info(); inst2->info(); delete(inst1); delete(inst2); }
oder****?
-
Hallo,
ich würde dir empfehlen nocheinmal im Internet die genaue Definition nachzulesen oder falls du hast in einer Literatur.
Kopier- und Zuweisungskonstruktor ist im Allgeminen dasselbe, differenziert wird m.E. nur durch die Anwendung.
Dann ist es so das bei dem ersten Teil, wo du Kopierkonstruktor geschrieben hast, dem auch so ist.
Beim zweiten ist es aber nur eine ganz normale Zuweisung, da das Objekt dort ja schon existiert. Dort werden einfach nur die Daten 1:1 in das andere Objekt kopiert (wobei hier Vorsicht - nicht immer so).
GrüßeWas soll daran kompliziert sein? Es muss doch nur ein Rad bewegt werden, man kann aufsteigen, es kommt die Matschhütte und durch den Regenbogen gelangst du zum hungrigen Affen, der Affenschwanz wird gezogen und bums kommst du zum Paradispark.
-
Hey,
also ein Kopierkonstruktor, ist ein Konstruktor, der als Parameter eine Referenz auf ein Objekt selbigen Typs nimmt.
Eben weil dieser im unten stehenden Code nicht aufgerufen wird, kann man ohne die Klasse gesehen zu haben, keinerlei Aussagen darüber machen.
Ein Destruktor hat in der Regel folgendes Zeichen am Anfang ~ und sieht ansonsten genau wie der Konstruktor der Klasse aus.
Zuweisungsoperator = (bitte verbessert mich, wenn ich mich irre
Viele GrüßeGeändert von VScan (31.10.11 um 20:04 Uhr) Grund: ABC
-
aaah ok
das ist verständlich. und jetzt hab ich ne frage zum standardkonstruktor.. normalerweise wird der doch wie bei Ueberweisung() mit den klammern geschrieben.. oder kann zb auch Buchung mittagessen; ein standardkonstruktor sein****?
-
Die Objekt-Initialisierung unterscheidet sich von der eigentlichen Objekt-Instanzierung, vielleicht solltest Du doch nochmal nachlesen

Edit: In Deinem Fall hast Du lediglich Speicher allokiert und die Buchung deklariert als mittagessenGeändert von VScan (31.10.11 um 20:13 Uhr)
-
und der destruktor wäre dann praktisch die letzte zeile also nach den delete****
-
genau, dieser wird bei dem Schlüsselwort(delete) explizit aufgerufen
-
Nein, der Destruktor ist in der selben Zeile wie delete.
Was ist an Buchung so geheim, dass du es nur über PN zeigen willst?
So könnte man dir gezielter helfen (da es CC etc. ja gar nicht geben muss).Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
sry: naja wie man es sieht, ich dachte yuro meint das Objekt(also den Zeiger), also inst1 bzw. inst2
-
es ist nix geheim
... nur ich dachte das man hier nix vollständiges posten darf.. also was ich jetzt hier reingestellt hab war ne andere aufgabe.. und ich sollte aus diesem programm abschnitt alles ermitteln.. dann hab ich einem kollegen gesagt das der destruktor die beiden delete zeilen sind er sagt mir es ist die zeile mit der } - Klammer.. also NACH delete
-
Man darf schon vollständige Sachen posten, warum auch nicht

Aber was Anderes: Bitte Netiquette, §15 beachten.
Also generell noch mal:
Ein Konstruktor wird dann aufgerufen, wenn eine Instanz erstellt wird.
Das ist bei mittagessen usw. in der Zeile, in der man die Variable eben anlegt.
Bei inst1/inst2 und anderen Pointern ist es da, wo "=new..." steht.
In der Klasse ist der Konstruktor die Funktion, die gleich heißt wie die Klasse selber.
Es kann auch mehrere K. geben, die verschiedene Parameter nehmen.
zB. einen, der keinen Parameter braucht, und einen, der drei int nimmt.
Je nachdem, was man beim Erstellen der Variable übergibt (nichts oder eben 3 int)
wird der passende vom Compiler genommen.
Der Copykonstruktor (damits kürzer ist: CC) ist ein Sonderfall von K., der statt 3 int
oder so eine andere Variable von seiner Klasse nimmt, um anhand der Werte von der schon bestehenden Variable eine "Kopie" zu machen.
Der Zuweisungsoperator (=-Op) ist auch dafür da, die Werte von einer anderen Variable zu kopieren (wie bei int usw.). Im Unterschied zum CC wird der =-Op. dann genommen, wenn die betroffene Variable nicht gerade erst angelegt wird, sondern schon vorher existiert hat.
Sinn: Bei CC und = muss man ja - je nach Sinn der Klasse - nicht jede Variable 1:1 kopieren,
sondern kann bestimmte Variablen auch anders behandeln.
Wenn der CC aufgerufen wird, weiß man, dass die Anderen noch keinen Wert haben und auch was brauchen. Bei = weiß man, dass der CC damit schon was gemacht hat, und kann sich auf gültige Werte verlassen.
Und der Destruktor wird - als Gegenteil vom Konstruktor - dann aufgerufen, wenn die Instanz der Variable gelöscht wird. Sinn: zB. in der Klasse geöffnete Dateien zu schließen etc.
Nicht-Pointer-Variablen wie mittagessen verschwinden am Schluss des {}-Blocks, wo sie gemacht wurden, dort wird auch der Dest. aufgerufen (sieht man eben nicht im Code, macht der Compiler dazu). Pointer wie inst1, die die Instanz per new erhalten haben, werden nicht automatisch am Ende von {} weggeräumt, sondern mit einem delete. Dann ist beim delete der Dest.
So, hoffe, jetzt sind alle Klarheiten beseitigt
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
@sheel mega geile erklärung dankeeeeee dir

hab noch ne kleine Frage zu "virtual"... was ist der Sinn dieser funktion****?
-
Am Beispiel vom inst2 im Code:
Das ist ein eigentlich Buchung, bekommt aber ein Überweisung.
Möglich deshalb, weil Überweisung von Buchung erbt (ist ja auch eine Buchung, nur eine spezielle).
Angenommen, es gibt noch Steuerzahlung, das auch von Buchung erbt.
Also einerseits erbt Überweisung von Buchung, unabhängig von der Überweisung erbt auch Steuerzahlung von Buchung.
Und jetzt haben alle drei Klassen eine Funktion/Methode "Name", die am Bildschirm was ausgibt:
Bei Buchung wird "Das ist irgendeine Buchung" ausgegeben.
Bei Überweisung wird "Das ist eine Überweisung" ausgegeben.
Bei Steuerzahlung wird "Das ist eine Steuerzahlung" ausgegeben.
Wenn man jetzt eine Buchung-Variable macht und Name aufruft, wird
"Das ist irgendeine Buchung" ausgegeben.
Bei einer Überweisung-Variable "Das ist eine Überweisung",
und bei Steuerzahlung eben Steuerzahlung.
Soweit alles in Ordnung.
Wenn man jetzt aber (wie bei inst2 oben) eine Buchungsvariale macht,
aber zB. in Wirklichkeit eine Steuerzahlung reinspeichert, und dann
Name auruft, kommt "Das ist irgendeine Buchung" heraus.
Obwohl ja Steuerzahlung drin ist.
Wenn Name jetzt virtual ist bekommt man wirklich "Das ist eine Steuerzahlung".
Ohne virtual wirds also vom "offiziellen" Variablentyp genommen,
mit virtual vom tatsächlichen Inhalt.
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
Was sind Konstruktoren?
Von Davicito im Forum JavaAntworten: 4Letzter Beitrag: 27.10.10, 11:55 -
Konstruktoren
Von drpingoo im Forum C/C++Antworten: 2Letzter Beitrag: 17.09.08, 18:41 -
Konstruktoren
Von mostwanted90 im Forum C/C++Antworten: 12Letzter Beitrag: 22.03.07, 14:16 -
Konstruktoren bei Qt
Von Azi im Forum C/C++Antworten: 5Letzter Beitrag: 11.08.06, 18:39 -
Konstruktoren
Von MrDude im Forum C/C++Antworten: 1Letzter Beitrag: 25.01.04, 14:22





Zitieren

Login






