Verkettete Liste - Zeigerzuweisungen



  • Hi,

    bin gerade dabei mir eine eigene verkettete Liste zu programmieren.

    Ich erklärs hier mal kurz. Wem die nachfolgende Erklärung zu lang ist, der schaut sich einfach den Code, d.h. die Mainfunktion am Ende des Beitrags an. Dort ist das Problem noch mal kommentiert.

    Meine Idee:
    -Eine Grundklasse mit GetNext(){return this;}, GetPrevious(), GetLast() usw.
    -Eine Klasse mit allen zu speichernden Werten z. B. String name, int nummer usw.

    Ich vererbe dann die Grundklasse an die normale Klasse. Ich kann dann von der normalen Klasse aus auf die Funktionen der Grundklasse zugreifen.

    Beispiel der Vererbung
    class Klasse : public Grundklasse ...

    Beispiel des Funktonszugriffs
    Klasse->GetNext();

    Für die verkettete Liste brauch ich aber auch so was:

    Klasse *test1=new Klasse();
    Klasse *test2;

    und dann
    test2=test1->GetNext();

    Und genau hier steigt der Compiler aus: Ich kann die Funktion
    Grundklasse *Grundklasse::GetNext(){return this;}
    nicht verwenden, da es einen Zeiger auf die Klasse "Grundklasse" liefert. Der Compiler will aber einen Zeiger vom Typ "Klasse" haben.

    Wie krieg ich den jetzt dazu, das er das aktzeptiert?

    Die Fehlermeldung:

    27 C:\test\main.cpp invalid conversion from `verketteteliste*' to `listenitem*'
    

    kommt in folgendem Beispiel vor:

    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    class verketteteliste;
    class listenitem;
    
    class verketteteliste
    {
    	public:
    		verketteteliste *Next();
    };
    
    class listenitem : public verketteteliste
    {
    	public:
    		listenitem *itemfunktion();
    };
    
    int main(int argc, char *argv[])
    {
    	listenitem *item1;
    	verketteteliste *vkliste=new verketteteliste();
    
    	item1=vkliste->Next(); //Mag er nicht, da Next() nicht vom Typ listenitem sondern vom Typ verketteteliste. Item1 ist aber Typ listenitem.
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    verketteteliste *verketteteliste::Next()
    {
    	return this;
    }
    
    listenitem *listenitem::itemfunktion()
    {
    	return this;
    }
    


  • warum das aufsplitten in 2 klassen?

    ein einfaches

    template <class T>
    class list
    {
    public:
    list *next;
    list *prev;
    T entry;
    };
    

    machts wo nicht?

    bb


Anmelden zum Antworten