tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
351
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    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****..
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  3. #3
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    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****?
     

  4. #4
    Avatar von Jennesta
    Jennesta Jennesta ist offline Mitglied Gold
    Registriert seit
    Sep 2007
    Ort
    Aachen
    Beiträge
    215
    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üße
     
    Was 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.

  5. #5
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    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üße
    Geändert von VScan (31.10.11 um 20:04 Uhr) Grund: ABC
     

  6. #6
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    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****?
     

  7. #7
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    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 mittagessen
    Geändert von VScan (31.10.11 um 20:13 Uhr)
     

  8. #8
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    und der destruktor wäre dann praktisch die letzte zeile also nach den delete****
     

  9. #9
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    genau, dieser wird bei dem Schlüsselwort(delete) explizit aufgerufen
     

  10. #10
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  11. #11
    Avatar von VScan
    VScan VScan ist offline Mitglied Gold
    Registriert seit
    Dec 2008
    Ort
    Munich
    Beiträge
    131
    sry: naja wie man es sieht, ich dachte yuro meint das Objekt(also den Zeiger), also inst1 bzw. inst2
     

  12. #12
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    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
     

  13. #13
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  14. #14
    yuro yuro ist offline Mitglied Silber
    Registriert seit
    Jan 2010
    Beiträge
    89
    @sheel mega geile erklärung dankeeeeee dir

    hab noch ne kleine Frage zu "virtual"... was ist der Sinn dieser funktion****?
     

  15. #15
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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

  1. Was sind Konstruktoren?
    Von Davicito im Forum Java
    Antworten: 4
    Letzter Beitrag: 27.10.10, 11:55
  2. Konstruktoren
    Von drpingoo im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 17.09.08, 18:41
  3. Konstruktoren
    Von mostwanted90 im Forum C/C++
    Antworten: 12
    Letzter Beitrag: 22.03.07, 14:16
  4. Konstruktoren bei Qt
    Von Azi im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 11.08.06, 18:39
  5. Konstruktoren
    Von MrDude im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 25.01.04, 14:22