Bitte um Hilfe bei Verständisproblem Konstruktoren



  • Hallo zusammen,

    ich kann grundlegende Sachen von JAVA. Nun möchte ich mich ein bisschen in C++ reinlesen.

    Ich habe folgenden Quelltext:

    #include <iostream>
    using namespace std;
    class Konto
    {
    private:
    int KtoNr;
    //...
    public:
    Konto () : KtoNr(999) /////WAS BEDEUTET HIER DER DOPPELPUNKT? IN JAVA HIES IS Z.B: KtoNr = 999
    
    { cout << "1: Konto(), KtoNr: " << KtoNr << endl; }
    
    Konto (int kNr) : KtoNr(kNr)
    { cout << "2: Konto(int), KtoNr: " << KtoNr << endl; }
    };
    
    class Girokonto : public Konto
    {
    private:
    float Dispo;
    public:
    Girokonto () : Dispo(2000)
    { cout << "4: - Girokonto(), Disp.: " << Dispo << endl; }
    Girokonto (float d) : Dispo(d)
    { cout << "5: - Girokonto(float), Disp.: " << Dispo << endl; }
    Girokonto (int kNr, float d) :  Konto(kNr) , Dispo(d)
    { cout << "6: - Girokonto(int,float), Disp.: " << Dispo << endl; }
    };
    
    int main()
    {
    
    Girokonto a, b(5500.0), c(123,1000.0);
    
    }
    

    Die erste Frage steht im Quelltext 🙂

    Wie ist die Vorgehensweise im Programm (beim Objekt c zum Beispiel)
    1.: Es wird ein Objekt c der Klasse Girokonto erzeugt
    2.: Normal sollte doch der Konstruktor der Baisklasse aufgerufen werden (bei Java über super)
    Beim Objekt c wird der Konstruktor "Girokonto (int kNr, float d) : Konto(kNr) , Dispo(d)" aufgerufen.

    Erkennt man hier im Quelltext dass der Konsrutkor der Basisklasse aufgerufen wird (Es steht zwar Konto(kNr) dort, aber ich dachte immer dass angegen werden muss, wenn der Konstruktor der Superklasse aufgerufen werden soll.)

    Vielen Dank für die Hilfe!

    Viele Grüße



  • Der Doppelpunkt leitet die Initialisierungsliste ein. Beim Eintreten in den Funktionsblock des Konstruktors müssen alle Klassenobjekte bereits fertig konstruiert sein, wobei standardmäßig der Standardkonstruktor dafür benutzt wird. Die Initialisierungsliste gibt dir die Möglichkeit, stattdessen einen anderen Konstruktor aufzurufen.



  • Hallo!

    Danke für den Hinweis! Jetz da ich weiß wie der Fachbegriff heißt kann ich mich weiter schlau machen!

    Ich habe noch eine Frage:

    Gegeben ist folgender Code:

    int main()
    {
    Mitarbeiter Meier;
    Mitarbeiter.Gehalt=2000;
    Mitarbeiter.datenausgeben();
    system("Pause");
    return 0;
    }
    

    Es sollen hier die Fehler gefunden werden:

    Mein Vorschlag:

    1. Fehler: Meier.Gehalt = 2000 müsste es heißen, da Meier das Objekt ist
    2. Fehler. Mitarbeiter.Gehalt = 2000 ist keine Methode, sondern würde den Wert direkt setzen (Es gibt doch auch Klassenvariablen, dann könnte es ja stimmen?)
    3. Fehler Meier.datenausgeben() müsste es heißen.

    Stimmen meine Ausführungen?

    zum 2. Noch mal: Wenn es eine Klasenvariable wäre, dann könnte man die ja trotzdem nicht aufrufen, da main () außerhalb der Klasse steht? (bei JAVA ist main immer in einer Klasse)

    Viele Grüße



  • 1./3. Richtig.
    2. Ist auch nicht anders als in Java. Wenn Gehalt public ist, funktioniert das auch außerhalb der Klasse "Mitarbeiter" und andernfalls nicht.



  • Hallo!

    Es müssen insgesamt 3 Fehler im Programm sein.

    Kann man dann sagen, dass der 2. Punkt einfach Meier.Gehalt = 2000 heißen muss?

    Viele Grüße



  • Kann man dann sagen, dass der 2. Punkt einfach Meier.Gehalt = 2000 heißen muss?

    Interpretationssache. Nach meiner Intepretation schon. Der erste Fehler geht auf das Konto der fehlenden Mitarbeiterklasse, daher kannst du dir an dieser Stelle aussuchen, ob Meier.Gehalt = 2000; ein Fehler sein wird oder nicht. Da aber die anderen beiden Fehler schon für die Klassen/Objektnamenvertauschung in Z. 4/5, sowie für system in Z.6 (falls nur Compilerfehler gelten, dann zählt die fehlende Einbindung von cstdlib) benötigst, musst du dafür sorgen, dass Mitarbeiter Meier.Gehalt = 2000; kompiliert, sonst hättest du mehr als drei.



  • Also noch mal kurz festhalten:

    1. Fehler: Mitarbeiter.datenausgen() ist falsch ==> Meier.datenausgeben();

    Aber dann kann doch Mitarbeiter.Gehalt = 2000 doch auch korrekt sein, wenn Gehalt eine Klassenvariable ist? Theoretisch kann ja auch Mitarbeiter.datenausgeben() korrekt sein, wenn es eine Klassenmethode ist??

    Was meinst du denn mit

    sowie für system in Z.6 (falls nur Compilerfehler gelten, dann zählt die fehlende Einbindung von cstdlib) benötigst, musst du dafür sorgen, dass Mitarbeiter Meier.Gehalt = 2000; kompiliert, sonst hättest du mehr als drei.

    der Zeile 6? Die passt doch, oder?

    Viele Grüße



  • In dem Fall müsste es

    Mitarbeiter::Gehalt = 2000;
    Mitarbeiter::datenausgeben();
    

    heißen. Ich hoffe aber doch stark, dass das nicht gemeint ist.


Anmelden zum Antworten