Wie kann ich hieraus ein Template machen ?



  • Hallo,

    ich habe mir mühsam nun endlich mal eine verkettet Liste selbst gebaut.
    Leider aber so, dass sie nur mit Elementen vom Typ class MyObject funktionert.
    Meine Frage ist nun, wie kann ich die zugänglich für alle möglichen Datentypen machen, das mache ich doch mit Templates oder ?

    #pragma once
    #include "MyObject.h"
    
    class CMyList
    {
    public:
        CMyList(void);
        ~CMyList(void);
    private:
        class CMyListElement                                        // Die einzelnen Elemente der Liste
        {
        public :
            CMyListElement* m_ptr_Next;                             // Pointer auf das nächste Element
            CMyListElement* m_ptr_Previous;                         // Pointer auf das vorige Element
            CMyObject* m_ptr_Objekt;                                // Pointer auf das Objekt als Element der Liste
            CMyListElement(CMyObject& Object);                      // Konstruktor
            ~CMyListElement(void);                                  // Destruktor
        };
    
        CMyListElement* m_ptr_Start;                            // Pointer auf Anfang der Liste
        CMyListElement* m_ptr_End;                              // Pointer auf Ende der Liste
        CMyListElement* m_ptr_ListElement;                      // Pointer auf ein Listenelement
        int m_NumberElements;                                   // Anzahl Elemente in der Liste
        bool m_Empty;                                           // Liste leer ?
    
    public:
        void AddFirst(CMyObject& Object);                       // Element an den Anfang anfuegen
        bool IsEmpty(void);                                     // Liste leer ?
        void AddEnd(CMyObject& Object);                         // Element an das Ende anfuegen
        void RemoveFirst(void);                                 // erstes Element der Liste entfernen
        int GetCount(void);                                     // Zaehlen der Listenelemente
        void RemoveEnd(void);                                   // letztes Element der Liste entfernen
        void RemoveAll(void);                                   // Alle Elemente der Liste entfernen
        CMyObject& GetElementAtPosition(int pos);               // Element von einer bestimmten Position holen
        void RemoveElementAtPosition(int pos);                  // Element an einer bestimmten Position entfernen
        void SetElementAtPosition(CMyObject& Object, int pos);  // Element ein eine bestimmte Position hinzufuegen
    };
    

    Muß ich dann auch meine Methoden-Definitionen wieder in die Header holen ?



  • Ja, du musst sie in den Header holen...

    Ich denke so in etwa könnte deine Klasse als Template-Klasse aussehen

    #pragma once
    #include "MyObject.h"
    
    template<typename T>
    class CMyList
    {
    public:
        CMyList(void);
        ~CMyList(void);
    private:
        class CMyListElement                                        // Die einzelnen Elemente der Liste
        {
        public :
            CMyListElement* m_ptr_Next;                             // Pointer auf das nächste Element
            CMyListElement* m_ptr_Previous;                         // Pointer auf das vorige Element
            T* m_ptr_Objekt;                                // Pointer auf das Objekt als Element der Liste
            CMyListElement(T& Object);                      // Konstruktor
            ~CMyListElement(void);                                  // Destruktor
        };
    
        T* m_ptr_Start;                            // Pointer auf Anfang der Liste
        T* m_ptr_End;                              // Pointer auf Ende der Liste
        T* m_ptr_ListElement;                      // Pointer auf ein Listenelement
        int m_NumberElements;                                   // Anzahl Elemente in der Liste
        bool m_Empty;                                           // Liste leer ?
    
    public:
        void AddFirst(T& Object);                       // Element an den Anfang anfuegen
        bool IsEmpty(void);                                     // Liste leer ?
        void AddEnd(T& Object);                         // Element an das Ende anfuegen
        void RemoveFirst(void);                                 // erstes Element der Liste entfernen
        int GetCount(void);                                     // Zaehlen der Listenelemente
        void RemoveEnd(void);                                   // letztes Element der Liste entfernen
        void RemoveAll(void);                                   // Alle Elemente der Liste entfernen
        T& GetElementAtPosition(int pos);               // Element von einer bestimmten Position holen
        void RemoveElementAtPosition(int pos);                  // Element an einer bestimmten Position entfernen
        void SetElementAtPosition(T& Object, int pos);  // Element ein eine bestimmte Position hinzufuegen
    };
    


  • HI

    Du machst ein Listentemplate und eins für die Elemente

    template<class T>
    class ListElem
    {
      public:
      protected:
      private:
    };
    
    template<class T>
    class List
    {
      public:
      protected:
      private:
         ListElem<T> *m_head;
         ListElem<T> *m_tail;
    };
    

    Und ja die Implementierung packst du besser mit in den header.

    Ps: Warum benutzt du nicht die STL list ?

    [ Dieser Beitrag wurde am 02.06.2003 um 13:57 Uhr von prolog editiert. ]



  • Oder so !



  • Achso, zusätzlich zu dem "#pragma once" würde ich noch normale Include-Guards einbauen, da nicht sichergestellt ist, dass jeder Compiler "#pragma once" kennt 😉


Anmelden zum Antworten