Verkettete Liste mit getrennten Nutzdaten...?
-
Hallo folgendes Problem:
Klasse der Liste:
#ifndef LISTE_H #define LISTE_H #include <iomanip> #include <string> #include "StdAfx.h" #include "Eie.h" #include "Control.h" // Klasse der Listenelemente class Clistelement { friend class Cliste; private: void *daten; // Nutzdaten Clistelement *next; Clistelement *vor; Clistelement(); //Konstruktor für Listenelemente ~Clistelement(); //Destruktor }; // ENDE Klasse Listelement // Klasse der Liste class Cliste { private: Clistelement *anfangliste; //Pointer auf erstes Element der Liste Clistelement *endliste; // Pointer auf letztes Element der Liste int anzahl; // Anzahl Elemente der Liste public: Cliste():anzahl(0), anfangliste(NULL) {}; ~Cliste(); //Listenmethoden für CEie-Listen void add_beginn(); //Element am Anfang anhängen void add_end(); // Element am Schluss anhängt void del_liste(); int get_anzahl() {return anzahl;}; //holt die Anzahl Einträge void sort(); //Element sortiert einfügen nach Stelle in File }; #endif
Nun habe ich folgende Methode (welche nicht funktioniert...):
void Cliste::sort()[cpp] { Clistelement *neu; neu = new Clistelement(); Clistelement *hilfs=anfangliste; Clistelement *vor=anfangliste; if(anfangliste==NULL) { add_beginn(); hilfs=NULL; //damit if() unten nicht mehr abgearbeitet wird! } else { }; if(hilfs->daten->lektion > neu->daten->lektion && vor==hilfs) //&& vor==hilfs damit wenn if() oben gemacht unten nicht nocheinmal { add_beginn(); hilfs=NULL; } else { }; while(hilfs) { if(hilfs->daten->lektion > neu->daten->lektion) { vor->next=neu; neu->next=hilfs; hilfs=NULL; anzahl++; } else { vor=hilfs; hilfs=hilfs->next; if(hilfs==NULL) { vor->next=neu; anzahl++; endliste=neu; }; }; }; }
Folgende Fehler Meldung:
Kompilierung läuft... Liste_methoden.cpp h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(146) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(146) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(158) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(158) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen Fehler beim Ausführen von cl.exe.
Was mach ich falsch? - Gruss sb
-
daten ist ein void-Pointer, also kannst du nicht ->lektion darauf anwenden. Woher soll der Compiler denn wissen, dass das in Wirklichkeit eine Struktur ist, die zufällig so ein Feld hat?
Bevor ich jetzt irgendwelche Lösungsvorschläge ausbreite: Wieso soll das denn ein void-Pointer sein? Weil du dann "allgemeine" Daten in der Liste unterbringen kannst? Naja, warum geht dann die sortier-Methode davon aus, ein struct mit einem Member namens lektion vorzufinden? Also: Entweder richtig generisch, oder gar nicht.
-
richtig getippt! ich möchte eine datenunabhängige liste, damit ich diese überall verwenden kann. habe zwei Klassen, welche ich verwenden möchte:
Cnutzdaten Ccontroldaten
die methode
sort()
, welche du kritisiert hast, brauche ich nur, wenn die liste objekte der klasse
Cnutzdaten
enthält
kannst du mir sagen, wie ich das machen kann?
-
void pointer ist immer falsch. statt dessen template oder polymorphie. hier siehts eher nach template aus. und wenn du es unbedingt so java maessig lassen willst, kannst du dem sort eine comparator klasse uebergeben, die int compare(void*, void*) implementiert. genau wie in java eben. machst du das eigentlich als uebung, oder kennst du std::list nur nicht?
-
also1: hab noch nie was mit java zu tun gehabt (C++ und MFC - mein tümpel)
also2: kenne std::list nicht
also3: kenne auch template nicht
also4:
dies ist meine erste (merkt man wohl...) liste mit unabhängigen daten.
versuche erfolglos diese zu erzeugen.also5: nein ich mach das nicht zum spass - die ist eine semesterarbeit
frage:
kann ich dem sort() irgendwie mitteilen, auf welche struktur (klasse)es
gerade zeigt?nicht nur sort(), sonder auch allgemein. wie löst man dieses problem mit unabhängigen daten in C++?
ich habe eine billige vorlage - dort drin steht void *pnutzdaten...scheint aber deiner ansicht nach falsch zu sein
-
chaos.sb schrieb:
ich habe eine billige vorlage - dort drin steht void *pnutzdaten...scheint aber deiner ansicht nach falsch zu sein
Nicht unbedingt falsch, aber sehr, sehr umständlich. Und in C++ auch noch häßlich (kopieren usw). Templates sind die beste Lösung.
-
wie genau ist die semesterarbeit formuliert? sollst du einen container implementieren oder brauchst du den nur als kleines raedchen? dann nimm einfach std::list oder std::vector. oder kuck sie dir an und nimm sie als grundlage fuer deine implementation. die void pointer idee ist sehr schlecht. wenn du wissen willst, wie du dem trotz void* beibringst, wie er vergleichen soll, kuck dir an wie funktoren oder wenigstens funktionspointer funktionieren.
-
Heißer Tip fürne Semesterarbeit.
Es gibt etwas das nennt man Bücher,
das sind viele Blätter Papier an einer Seite mitenander verbunden
Auf den einzelnen Seiten stehen meist so schwarze Flecke die nennt man Buchstaben.
Wenn man die Buchstaben zu Wörtern zusammsetzt kann man das lesen
Und wenn auf der ersten Seite nicht Josephine Mutzenbacher sondernC++ entpackt
von Herbert Schildt
mitp
ISBN 3 8266 0731 7steht ist es das richtige und es gibt dort vieles interessantes zu
Templates
std:listTschuldigung bin etwas herb drauf
Aber das Buch kann dir wirklich weiterhelfen.
-
ich hasse dieses verschissene neue forum. jetzt musste ich mich ausloggen, um posten zu koennen, weil er mich sonst nicht laesst weil er der meinung ist, ich haette keinen benutzernamen angegeben. (kann man ja nicht, wenn man eingeloggt ist.)
-
chaos.sb schrieb:
C++ und MFC - mein tümpel
alles irgendwie typisch. und der rest passt auch dazu :(.
tipp: statt zu schlafen, les in den vorlesungen lieber ein buch
-
Kinders seit doch nicht so bös, er ist dochn Student
und die lernen sowas im Schlaf