Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Iteration aus Klasse heraus

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.06.2011, 18:24 Uhr
Arthurspooner



Hallo,

Ich habe einen Pointer zu einer Klasse erstellt. Aus der Klasse heraus möchte ich eine Rechnung durchführen, die auf das vorherige "this-1" und auf das nächste Element "this+1" zugreift.

Problematisch wird das nur beim ersten und letzten Element, wie kann ich überprüfen ob es sich um eines davon handelt ?

mfg

Arthur
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.06.2011, 20:37 Uhr
ao

(Operator)


Das kommt darauf an, wie die Elemente organisiert sind. Handelt es sich um ein Array? Oder stecken sie in einem Container?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.06.2011, 20:57 Uhr
Arthurspooner



In einem Array
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.06.2011, 08:44 Uhr
ao

(Operator)


Das wird schwierig. Array-Elemente wissen nichts über ihre Nachbarn oder darüber, ob sie Randelemente sind.

Vielleicht kannst du an beiden Rändern ein überzähliges Element platzieren, komplett auf NULL setzen und das zur Laufzeit abprüfen. Guter Stil ist das aber nicht.

Auf jeden Fall solltest du das nicht einfach laufen lassen, sondern im Debugger Schritt für Schritt testen, also falls du das noch nicht kannst, hier mein elftes Gebot für Programmierer: Du sollst frühzeitig lernen den Debugger zu benutzen.

Zeig am besten mal die Deklarationen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.06.2011, 23:58 Uhr
~Arthurspooner
Gast


Hauptprogramm:

Weg *Wegstrecke;

Wegstecke = new Weg[20];

In der Klasse, vereinfacht:

int x;
int y;

y = (this-1)->x;

Dies klappt wunderbar, nur halt nicht für das erste Element nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.06.2011, 13:45 Uhr
ao

(Operator)


Nö, so geht das leider nicht, das gibt ein C-Array nicht her.

Aber denk noch mal über dein Design nach und überleg, ob es notwendig ist, dass (this-1)->x in this->y dupliziert wird. Es ist immer ein Risiko und eine potentielle Fehlerquelle, dieselbe Information mehrfach zu speichern. Im vorliegenden Fall kann es passieren, dass jemand an einem Weg-Element das x ändert und nicht daran denkt, dass er auch am nächsten das y ändern muss. Dann sind die Daten inkonsistent und der Weg nicht mehr zusammenhängend.

Manchmal kann es aus "höheren Gründen", z.B. aus Performancegründen, geboten sein, das so zu machen, aber normalerweise versucht man immer, eine Information an genau einer Stelle zu haben und bei Bedarf von dort zu holen.

Du könntest zum Beispiel die Weg-Elemente über Member-Pointer verketten:

class Weg
{
Weg * vorgaenger;
int x;
};

this->vorgaenger = this-1;

und für das erste Element

this->vorgaenger = 0;

Dann könnte jedes Weg-Element seine Länge über

(vorgaenger != 0)
? x - vorgaenger->x
: 0

berechnen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.06.2011, 15:49 Uhr
Arthurspooner



Danke für den Tipp die Weg-Elemente über Member-Pointers zu verketten, das werde ich so machen.

Wie setz ich denn gerade für das erste Element this->vorgaenger = 0 ? Dazu müsste ich ja wissen, dass es sich um das erste Element handelt und das war ja mein Eingangsproblem.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.06.2011, 16:39 Uhr
ao

(Operator)


Entweder explizit über

Weg * Wegstrecke = new Weg[20];
Wegstrecke[0].vorgaenger = 0; // wenn vorgaenger private ist, machst du dir einen Setter dafür.

oder im Default-Konstruktor, der bei new Weg [20] für jedes Element aufgerufen wird. Dann ist es für alle Elemente erst mal auf 0 gesetzt, bis du es umsetzt.

Alternativ dazu gibts die Möglichkeit, statt eines Arrays einen passenden STL-Container zu verwenden. Wenn man eh schon C++ einsetzt, ist das häufig der bessere Weg.

So oder so, du musst diese Verkettung auf jeden Fall von außen steuern, die Weg-Elemente können das nicht selbst. Und falls dir jetzt auffällt, das passt aber grad schlecht, dann solltest du nochmal deinen Entwurf überprüfen. Häufig zeigen sich Entwurfsfehler daran, dass man die Klassenbeziehungen und Operationen nicht so wie ausgedacht programmieren kann.

Bei einem "guten" und richtigen Design dagegen gehen alle Operationen automatisch wie von selbst.

Vielleicht sollte das, was du "Weg" nennst, besser "Wegstück" heißen. Und ein "Weg" ist ein Container für mehrere Wegstücke und kümmert sich darum, die Stücke in der richtigen Reihenfolge hintereinander zu legen. Die Funktion "Berechnung der Längen" könnte sich dann vom Wegstück in den Weg verlagern.

Oder wie auch immer, das war bloß so ne Idee. Jedenfalls, ein guter Softwareentwurf ist eine Kunst und nicht mal so eben hingekritzelt. Da steckt die eigentliche kreative Arbeit drin. Das Runterschreiben des Codes ist nur Handwerk.

Dieser Post wurde am 21.06.2011 um 16:41 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: