[Anfänger] Verständnisproblem: Klassendeklarationen mit Pointern



  • Hallo.

    Bereite mich derzeit auf meine Klausur "Einführung in die Informatik 1" vor.
    Habe das dazu das ganze Skript meines Dozenten zusammengefasst/ergänzt.

    Dabei treten im Skript selber immer wieder Implementierungen von verketteten Listen, Bäumen, Graphen etc in C++ auf.

    Beispiel: Verkettete Liste

    class ListElem {
    public:
       // Konstruktor
       ListElem(T∗  d) {
          next = NULL;
          data = d;
       }
    
       T∗          getData(void)         { return data; }
       void        setNext(ListElem∗  n) { next = n; }
       ListElem∗   getNext(void)         { return next; }
    
    private:
       T∗  data;         // Zeiger auf Datenobjekt
       ListElem∗  next;  // Zeiger auf nächste Element
    
    //Hinweis: Wir gehen im Folgenden immer von Daten vom Typ T∗ aus!
    };
    

    Laut meinem Wissensstand ist der Operator (abgesehen mal von der Multiplikation) dafür da um Pointer zu (de)referenzieren. Allerdings ein vorrangestellter *-Operator.

    Ich hab mich über Klassen und Pointer/Referenzen eingelesen. An mehreren Stellen. Aber obige Code wird mir nicht klar.

    Ist T* und ListElem* auch eine eigene, hier nicht weiter deklarierte Klasse?
    Und (T* d) im Konstruktor ein Parameter d vom Typ T*? Zeiger auf d?

    Warum aber wird die Methode getData() auch mit Sternoperator deklariert?

    Das ganze verwirrt mich zunehmend und wird im Verlauf des Skripts schlimmer.
    Denn der Code dort ist immer ähnlich aufgebaut, eben mit diesem Stern-Operator am Ende einer Klassedeklaration. Und normal stelle ich diesen doch eben der Variablen vorran.

    Ich bitte untertänigst um Hilfe. 😃

    Gruß,
    Daniel



  • T∗
    

    ist T*

    Sorry, das bekomme ich irgendwie nicht in den Griff...



  • Wie würdest du einen Pointer deklarieren?



  • etern_r3 schrieb:

    Denn der Code dort ist immer ähnlich aufgebaut, eben mit diesem Stern-Operator am Ende einer Klassedeklaration. Und normal stelle ich diesen doch eben der Variablen vorran.

    Eine Klassendeklaration ist sowas:

    class Liste;
    

    Ich glauben nicht, dass dort irgendwo mal ein Stern bei dir im Skript steht.

    private:
       T*  data;         // Zeiger auf Datenobjekt
       ListElem*  next;  // Zeiger auf nächste Element
    

    Es steht doch schon genau da, was es bedeutet. data ist ein Zeiger auf ein T. next ist ein Zeiger auf ein ListElem. Die Klasse ListElem hast Du uns gezeigt. T ist irgendein anderer Typ. Wahrscheinlich steht das in Deinem BEispiel irgendwo. Vermutlich ist T ein Templateparameter.

    template<typename T>
    struct List
    {
     T* data;
    };
    
    void f()
    {
      int i = 42;
      int* j = &i;  // j ist ein Zeiger auf ein int. Wir können da die Adresse von i speichern.
      List<int> list;  // T ist jetzt int. 
      list.data = &i;  // T* ist jetzt ein Zeiger auf ein int.
      int k = *list.data;  // * als Dereferenzierung. j wurde der Wert von i zugewiesen.
    }
    

Anmelden zum Antworten