Archiv verlassen und diese Seite im Standarddesign anzeigen : Liste aus Objekten durchlaufen. Wie?
Hallo ich habe mir ein kleines Objekt angelegt:
class OBJEKT
{
public:
OBJEKT *next; // naechstes Element
int zahl;
}
jetzt möchte ich meine Objekte miteinander über den Pointer *next verknüpfen.
OBJEKT *kette = new OBJEKT;
kette->next = NULL;
OBJEKT *zahl = new OBJEKT;
// Wenn ich noch keine Zahl in meiner Kette habe...
if( kette->next == NULL)
{
kette->next = zahl;
}
else
{
// Wenn ich schon eine Zahl in der Kette habe ??? Was dann???
};
:confused:
zb mit
while(kette->next != NULL) {
kette = kette->next;
}bis zum letzten Objekt gehen, dann mit
kette->next = zahldas neue Objekt anhängen.
//edit: bin nicht sicher obs gerade so kompiliert und funktioniert, programmiere eigentlich nur C, sollte aber etwa so gehen.
Hallo danke dass klappt erstmal:
ich habe jetzt das Problem, dass ich die letzte Zahl nicht zu fassen bekomme.
OBJEKT *kette = new OBJEKT;
Schleife in der jedesmal eine Zahl erstellt und gesetzt wird
{
OBJEKT *zahl = new OBJEKT; // Buchstabe fuer jedes Zeichen erzeugen
Der Integer im Objekt Zahl wird mit einer Zahl gefüllt.
if( kette->next == NULL)
{
kette->next = zahl;
zahl->next = NULL;
}
else
{
OBJEKT *temp = kette;
while(temp->next != NULL){
temp = temp->next; // Durchlaufe die Liste bis zum Schluss
}
temp->next = zahl; // haenge dann das neue Objekt dran
zahl->next = NULL;
};
};
Ich habe bei 5 eingegeben Zahlen dann nur noch 4 bei der Ausgabe ?!?
Also war meine Fehler habe die while schleife für die Ausgabe falsch gebaut.
So ist es richtig:
OBJEKT *temp = kette;
while(temp->next != NULL){
temp = temp->next; // Durchlaufe die Liste bis zum Schluss
outfile << temp->zahl << " ";
}
Prinzipiell:
DU verwendest C++ um C zu programmieren !
Du solltest prinzipiell objectorientierter arbeiten ....
Ne "kette" lose in den speicher zu legen und ueber den zeiger auf das erste object zu verwalten im nutzcode ist ganz schechtes C++
besser, den nen conteiner (Kette/Liste) fuers verwalten erstellen, dem erst mal alle noetigen methoden verpassen ....
Dann funktionen fuers iterieren hinzu so dass im Nutzcode ziemlich einfach arbeiten kannst , z.b. nach dem Prinzip:
for(Myclass * p = cont.begin(); p ; p = cont.next(p))
{
}
Wenn schon C++ dann richtig !
Mittels public anderen Objecten zugriff auf die eigenen variablen geben -> schlecht ! (besser getter und setter schreiben)
NutzKlassen und Verwaltungsklassen besser trennen ! Nen Schwein was nen zeiger auf das Nachfolgende Schwein hat, ist unnatuerlich ! ALso lieber die Zeiger fuer die Kette in eigene node klassen auslagern .... das geht auch schon ohne templates nutzen zu muessen.
Ciao ...
Hallo und vielen Dank für die Kritik.
Ich bin froh wenn ich es besser machen kann.
Ich habe jetzt folgendes verstanden:
1. eine klasse als conteiner erstellen und darin alle Objekte verwalten
class Verwaltungsconteiner
{
??? conteiner??? Wie wird das in der Klasse mit deklariert?
conteiner begin();
conteiner next();
};
2. eine Klasse für die Objekte die im Conteiner gelagert werden.
class Nutzklasse
{
variable_1
variable_2
int getVar1(return variable_1);
void setVar1(int wert) {variable_1 = wert;};
...
}
3. Die Objekte dann zur Laufzeit im Conteiner ablegen:
Verwaltungsconteiner *cont = new Verwaltungsconteiner;
Nutzklasse *eins = new Nutzklasse;
eins.setVar1(5);
// ab in den Conteiner:
cont.putIn(eins);
// raus aus dem Conteiner:
for(Verwaltungsconteiner * p = cont.begin(); p ; p = cont.next(p))
{
outfile << cont.display(p);
}
Wie sieht das den anhand eines kleinen nutzbaren Quelltextes aus?
Ich habe jetzt nur eine Skizze abgegeben um grundsätzlich mein Verständnis darzulegen.
Beim direkten Umsetzten haperts aber...
Nen Brauchbaren container zu schreiben iss ja auch ned trivial ...
ohne templates tut man sich eh schwer (nen container auf einem bestimmten typ ist eh bloedsinn)
Denk mal das soll eh ne uebung nur sein, in der Praxis wirst dafuer eh die STL nutzen ....
Dein container ist fast immer Holder der Nutzklassen... deswegen sollt der die per copy selber "in den Speicher werfen"
deine Nutzklasse sollt dafuer dann nen copy operator haben.
erspart dir das new und delete per hand ...
Um das zu umgehen, spaeter mal wenn das ding Typunabhaengig als template gebaut hasst, kannst immer noch zeiger als Typ nehmen, dann bist natuerlich fuers reservieren und freigeben selber zustaendig ....
Damit spaeter die typunabhaengigkeit besser implementieren kannst, nimm gleich ertsmal typdefs und so wenig wie moeglich abhaengigkeiten von der Nutzdatenklasse in deinen container ....
der header der Verwaltungsklasse koennte dann so aussehen ca.
class DataClass; // forwarder reicht hier ... definieren braucht man die eh erst in der Impl ....
class Verwaltungscontainer
{
public:
Verwaltungscontainer();
Verwaltungscontainer(const Verwaltungscontainer & rx);
~Verwaltungscontainer(); // mit absicht ned virtuell
void Add( const DataClass & rx);
void clear();
size_t Count() const;
const DataClass * getFirst() const;
DataClass * getFirst();
const DataClass * getNext(const DataClass * pdata) const;
DataClass * getNext(const DataClass * pdata);
};
di iteration mittels pointer wird dir sicher an einigen stellen sorgen machen, bzw wirst da viel performance verlieren ...
Besser gleich das iterator prinzip anschauen und richtige iteratoren schreiben ...
Obige version bietet sich aber eigentlich nur bei combinierten containern an, wo die iteration ned so direkt erfolgen kann, sondern es "sonderfaelle" gibt ....
das Implementieren ueberlass ich dir, macht man im leben soweiso nur einmal zur uebung, ab dann nimmt man fertiges zeugs ^^
Ciao ...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.