template mit verschachtelten objekten



  • Hallo ihr Freunde des Programmierens!

    Ich hab ein Problem undzwar hab ich hier 3 verschachtelte template Objekte.
    ->LE und List ... hier ein auszug aus der Liste (LE hat ein value und ein zeiger auf das nächste element)

    #include "LE.h"
    
    template<typename type>
    class List{
    
    /////////////////////////////////////////////////////////
    //Attribute
    public:LE<type> * first ;
    public :LE<type> * last;
    unsigned int size;
    
    /////////////////////////////////////////////////////////
    //Konstruktor
    public: List(){
    size=0;
    first=0;
    last=0;
    
    }
    //...
    void append(type nvalue){
    	LE<type>* nele = new LE<type>(0,nvalue);
    
    	if(size==0){
    		first=nele;
    		last=nele;
    	}
    	else{
    		last->next=nele;
    		last=last->next;
    
    	}
    
    	size++; //größe merken
    
    }
    //...
    };
    

    das soll mal eine Hashtabelle werden... ich probier mich daran gerade aus

    und ich hab jetz die eigentliche Hashtabelle die die liste(n) dann in einem Array ablegt.

    #include "List.cpp"
    
    template<typename type>
    class Hasht{
    
    type * value;
    int size;
    
    public : Hasht(int size){
    
    value= new type[size];
    
    	for(int i=0;i<size;i++){
    		value[i]=List<type>();
    
    	}
    }
    
    };
    

    jetz zu dem problem:

    wenn ich das hasht objekt erzeugen will wie muss ich das machen? der will einen template typ haben aber ich will ja das der nur weitere objekte anlegt... wie kann ich das am besten machen? bzw. von welchem typ soll ich das hasht tamplate erzeugen?

    #include <iostream>
    #include "hasht.cpp"
    
    int main(){
    Hasht<type>* ht = new Hasht<type>(5); //oder ohne template?
    
    //geht nicht... hier kommt ein fehler
    
    }
    

    danke schonmal! 🙂



  • Naja du erzeugst ein Hasht objekt von dem Typen den du haben willst zum beispiel Int, wobei Hashwerte doch eh immer eine Mischung aus int und char ist oder? naja auch egal.Erzeuge doch erstmal eine int-Hasht

    #include <iostream>
    #include "hasht.cpp"
    
    int main(){
    Hasht<int>* ht = new Hasht<int>(5); //oder ohne template?
    
    //geht nicht... hier kommt ein fehler
    
    }
    

    So oder?

    Achja .cpp datei einbinden ist nicht gerade sinnvoll, man bindet eher immer .h dateien der Klasse ein und lagert die implementation der Klasse in eine .cpp aus.



  • Mizukage schrieb:

    Hallo

    Hi - lass mich raten: Du hast bis jz immer nur Java programmiert!?

    template<typename type>
    class List
    {
    public:
       List ();
       LE<type> * first;
       LE<type> * last;
    private:
       unsigned int size;
    };
    

    So sieht das doch schon sehr viel leserlicher aus!?
    Btw: Wozu brauchst du denn first, last UND size? es reichen 2 davon ^^ (sinnigerweise nicht last und size, aber first/last oder first/size ist imho geschmackssache ^^)

    public: List(){
    size=0;
    first=0;
    last=0;
    }
    

    Für so was gibts ne Initialisierungsliste... Und Einrücken wär echt auch mal ne Idee gewesen - wenn dus selbst nicht brauchst - ich seh so echt 0 in deinem Code durch >< (vor allem, da die Dateinamen au noch ein wenig suboptimal gewählt sind ^^)

    Hasht<type>* ht = new Hasht<type>(5);
    //Würde ich so machen:
    Hasht<type> ht(5); //wobei type dann nat. durch den jeweiligen typen zu ersetzen ist - aber ich denke, du weist, wie man templates einsetzt ^^
    
    #include "hasht.cpp"
    

    Wie der Feuerwehrmann schon gesagt hat: Das ist doof ^^
    Man sollte das nicht nur nicht machen, man DARF es gar NICHT - die IDE compiliert jede *.cpp einzeln - du wirst dann am Ende vom Linker ne Fehlermeldung erhalten, dass die Fkt xyz scho ma definiert wurde und er sie aber noch mal hat oder so was in der richtung...
    Normalerweise included man den header in der cpp und überall, wo man die klasse/fkt braucht, included man nur den header - und dem verpasst man noch includeguards...

    bb



  • @firefighter:

    ich will ja den wert.. int z.B. ja in dem "LE" haben also das letzte verschachtelte objekt... bin mir jetz nochnich ganz so sicher wie ich das mache.. werds morgen (heute..später) mal probieren 🙂

    unskilled schrieb:

    Hi - lass mich raten: Du hast bis jz immer nur Java programmiert!?
    > auch..zusammen mit cpp 😉

    So sieht das doch schon sehr viel leserlicher aus!?

    > mmh ich finds leserlich ... aber schon möglich das es so besser ist ich bin in der hinsicht offen 🙂

    Btw: Wozu brauchst du denn first, last UND size? es reichen 2 davon ^^ (sinnigerweise nicht last und size, aber first/last oder first/size ist imho geschmackssache ^^)

    > also first und size wollte ich haben.. last ist/war optional sozusagen ^^

    public: List(){
    size=0;
    first=0;
    last=0;
    }
    

    Für so was gibts ne Initialisierungsliste... Und Einrücken wär echt auch mal ne Idee gewesen - wenn dus selbst nicht brauchst - ich seh so echt 0 in deinem Code durch >< (vor allem, da die Dateinamen au noch ein wenig suboptimal gewählt sind ^^)

    > initialisierungsliste? bisher hab ich das so wie mein prof gemacht... entweder in der parameterliste initialisiert oder halt wie oben ...
    lass mir aber immer gerne neue (für mich neue) konzepte beibringen 🙂

    Hasht<type>* ht = new Hasht<type>(5);
    //Würde ich so machen:
    Hasht<type> ht(5); //wobei type dann nat. durch den jeweiligen typen zu ersetzen ist - aber ich denke, du weist, wie man templates einsetzt ^^
    

    > ah danke das bringt mich weiter!

    #include "hasht.cpp"
    

    Wie der Feuerwehrmann schon gesagt hat: Das ist doof ^^
    Man sollte das nicht nur nicht machen, man DARF es gar NICHT - die IDE compiliert jede *.cpp einzeln - du wirst dann am Ende vom Linker ne Fehlermeldung erhalten, dass die Fkt xyz scho ma definiert wurde und er sie aber noch mal hat oder so was in der richtung...
    Normalerweise included man den header in der cpp und überall, wo man die klasse/fkt braucht, included man nur den header - und dem verpasst man noch includeguards...

    > ok header dateien.... includeguards? meinst du macros (#ifndef _KLASSE_A__ #def ...)?


Anmelden zum Antworten