PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Liste aus Objekten durchlaufen. Wie?



24dan
03-01-2007, 17:19
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:

jeebee
03-01-2007, 18:43
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.

24dan
03-01-2007, 19:32
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 << " ";
}

RHBaum
04-01-2007, 09:59
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 ...

24dan
04-01-2007, 11:54
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...

RHBaum
04-01-2007, 16:22
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 ...