Nested Class umsetzen



  • Hallo,
    ich würde gerne eine Nested Class in einer Template-Klasse implementieren:

    Header:

    #ifndef AVLTREE_H
    #define AVLTREE_H
    
    #include <memory>
    
    template <typename T> class AVLTree {
    public:
    
    private:
      class Node {
        int height = 0;
        T value;
    
        std::unique_ptr<Node> left = nullptr;
        std::unique_ptr<Node> right = nullptr;
    
        Node(T v) : value(v) {}
      };
    
      int getHeight(std::unique_ptr<Node> p);
    };
    
    #endif // AVLTREE_H
    

    CPP:

    #include "avltree.h"
    
    int AVLTree::getHeight(std::unique_ptr<AVLTree::Node> p)
    {
        if (p == nullptr)
          return -1;
        else
          return p->height;
    }
    

    Leider erhalte ich bei der Implementierung folgenden Fehler (Zeile 4):

    AVLTree is not a class, namespace, scoped enumeration

    Weiß jemand weiter?

    Danke im Voraus!



  • Templates werden im Header implementiert, da die komplette Implementierung bei Gebrauch sichtbar sein muss => das Problem existiert nicht.

    Der Sinn der Funktion erschließt sich mir nicht: nach Aufruf wird der Konten gelöscht, dann ist die ehemalige Höhe wohl eher belanglos.



  • Ich muss also alles im Header implementieren?

    Ähm, ja, ich muss shared_ptr nutzen. Bin gerade noch dabei den Umgang damit zu lernen. 🙂



  • NestedClass schrieb:

    Ich muss also alles im Header implementieren?

    Ja

    Ähm, ja, ich muss shared_ptr nutzen. Bin gerade noch dabei den Umgang damit zu lernen. 🙂

    Nein! Die Funktion will ja keinen Besitz übernehmen => normalen Pointer benutzen.


  • Mod

    NestedClass schrieb:

    Ähm, ja, ich muss shared_ptr nutzen.

    Ich verstehe nicht, was deine Funktion mit Ownership zu tun hat, das einen Smart-Pointer rechtfertigt. Nimm doch einfach einen Zeiger.



  • D. h., shared_ptr nehme ich nur, wenn mehrere Objekte eine Referenz auf ein Datum haben?



  • Nein, shared_ptr nimmst du nur, wenn mehrere Objekte sich den Besitz an einem Objekt teilen, was praktisch nur extrem selten der Fall ist. In der Regel hat jedes Objekt genau einen Besitzer. Falls das Objekt aus irgendwelchen Gründen dynamisch erzeugt werden muss, verwendest du dann unique_ptr , um den einen (hence the name) Besiter des Objektes zu repräsentieren. Code, der ein Objekt nur referenziert (i.e., irgendwas damit macht), bekommt eine Referenz (oder einen Pointer) auf das Objekt...

    Zusammenfassung: Es war nie und ist nicht die Idee von Smartpointern, normale Pointer zu ersetzen. Leider suggeriert der unglücklich gewählte Name das offenbar, was bei Vielen zu Verwirrung führt. Smartpointer dienen dazu, den Besitz an einem Objekt zu repräsentieren, was eine zu Pointern und Referenzen konzeptionell völlig orthogonale Angelegenheit darstellt...



  • Ok, danke.
    Dann ist das aber ok, wenn ich unique_ptr bei den Member-Variablen left und right verwende und die Nodes auf dem Heap erstellt werden? Oder wäre es nicht besser die auf dem Stack zu erstellen?



  • NestedClass schrieb:

    Oder wäre es nicht besser die auf dem Stack zu erstellen?

    Wie willst du das machen? Ein AVL Baum isz ja sicher keine Konstante.



  • Ne, ich muss die auf dem Heap erstellen...


Anmelden zum Antworten