Initialisierungsliste



  • Hallo zusammen
    Mein Problem ist folgender Art. Ich begreiffe nicht ganz wieso Der Konstruktor StudentId zweimal erstellt also das Objekt id. Es steht einmal bei protected und einmal wird es vom Studentkonstruktor aufgerufen ist das korrekt?
    Und wieso man dann eine Initialisierungsliste benötigt ist mir auch nicht ganz klar xD

    int nextStudentId = 1000; 
    class StudentId
    {
      publi
        StudentId()
        {
            value = nextStudentId++;
            cout << "Naechste Studenten-ID " << value << " zuweisen" 
                 << endl;
        }
        StudentId(int id)
        {
            value = id;
            cout << "Studenten-ID " << value << " zuweisen" 
                 << endl;
        }
        ~StudentId(){cout << "zerstoere " << value << endl;}
      protected:
        int value;
    };
    
    class Student
    {
      public:
        Student(const char *pName, int ssId)
        {
            cout << "Erzeuge Student " << pName << endl;
            name = pName;
            StudentId id(ssId);    
        }
      protected:
        string    name;
        StudentId id;
    };
    
    int main(int argcs, char* pArgs[])
    {
        Student s("Chester", 1234);
    ...
    

    Danke für Eure Hilfe 🙂


  • Mod

    Der Konstruktor von StudentId wird einmal aufgerufen für das proteted-Memberobjekt von Student. Da Student keine Initialisierungsliste hat, wird der Standardkonstruktor genommen. Weiterhin wird im Konstruktor von Student ein weiteres lokales StudentId-Objekt namens id erstellt, mit dem Argument ssId. ⚠ Dieses Objekt hat rein gar nichts mit dem Memberobjekt id zu tun ⚠ und wird bei Verlassen des Student-Konstruktors sofort wieder zerstört.

    Und jetzt verstehst du hoffentlich auch den Sinn von Initialisierungslisten.



  • k ja alles kapiert 🙂 und wieso wird das objekt id das mit dem standardkonstruktor von Stundent erstellt wurde lokal abgespeichert? weil das andere schon den Namen belegt hat ?


  • Mod

    airglide schrieb:

    k ja alles kapiert 🙂 und wieso wird das objekt id das mit dem standardkonstruktor von Stundent erstellt wurde lokal abgespeichert? weil das andere schon den Namen belegt hat ?

    😕 Weil du es lokal erstellst:

    class Student
    {
      public:
        Student(const char *pName, int ssId)
        {
           int foo;   // Lokaler int namens "foo"
           name = "Mustermann";  // Memberobjekt "name" wird Wert zugewiesen
           double name; // Lokaler double namens "name". Überdeckt Student::name.
           name = 3.13; // Lokalem "name" wird Wert zugewiesen
           Student::name="Normalverbraucher"; // Memberobjekt wird Wert zugewiesen
           StudentId id(ssId); // Lokale StudentId id. Überdeckt Student::id.
        }
      protected:
        string    name;
        StudentId id;
    };
    

    Du kannst in einem Gültigkeitsbereich immer Objekte mit Namen aus höheren Gültigkeitsbereichen erstellen, die überdecken dann die höheren Namen.

    edit: Und außerdem solltest du immer mit höchsten Warnstufen compilieren, dann hättest du eine Warnung von wegen unbenutzter variablen bekommen.



  • ah k 🙂 alles klar danke


Anmelden zum Antworten