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