Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
23.11.2001, 15:07
Mazze



Hi!
Also ich würde Klasse, in der ein Element von einer anderen Klasse/Struktur ist, so definieren:
Quellcode:
class BasisB : public Basis
{
State state;

public:
BasisB() { state.state = 30; }
void out() { std::cout << "BasisB " << state.state << "\n"; }
};

Aber in meinem C++-Buch sehe ich oft dieses hier:
Quellcode:
class BasisA : public Basis
{
State *state;

public:
BasisA() { state = new State; state->state = 12; }
~BasisA() { delete state; }
void out() { std::cout << "BasisA " << state->state << "\n"; }
};

Was ist an der Version besser?
Ist es schneller?
Flexibler?

Es ist halt umständlicher mit dem new und delete!

thx
Matze

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
001
23.11.2001, 21:33
Prefect



Es ist eventuell flexibler, je nachdem was du willst. Ansonsten ist es langsamer und braucht mehr Speicherplatz. Solange du aber nicht vorhast, verschiedene States miteinander auszutauschen über Pointer brauchst du es nicht.

Überhaupt ist dein Problem wahrscheinlich eher das Verständnis von Pointern.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
24.11.2001, 00:44
Another1



Prefect, du bist in letzter Zeit aber echt mies drauf, .. Sei doch nich so direkt ;)

egal, also Mazze, wie prf schon sagte is es bei diesem Beispiel ziemlich egal, bzw die nich-pointer variante ist sogar vorzuziehen

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
003
24.11.2001, 11:04
Mazze



Wieso sollte ich Probleme mit Pointern haben?
Ich benutze die ganze Zeit Pointer...
Nur halt nicht so, wie in diesem Buch beschrieben!

Ich wollte nur wissen, ob's besser ist. Da es ja eurer Meinung nach NICHT besser ist, werd ich's halt normal machen!

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
004
24.11.2001, 12:35
Another1



Es kommt ja eben drauf an

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
005
24.11.2001, 12:39
Mazze



Hm....
Kannst du mir evtl. ein Beispiel geben, bei dem es besser ist Speicher zu reservieren?

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
006
24.11.2001, 16:09
Another1



also, kein Beispiel wo es sinvoll ist Speicher zu alloziieren, aber pointer zu verwenden

class Pic ...

class BasisA : public Basis
{
Pic*pic;

public:
BasisA() { pic = NULL;}
~BasisA() { delete pic; }
void out() { if(pic) pic->Draw() }
void SetPic(Pic *_pic) { pic = _pic; }
};

ok, auch blödes Beispiel, aber du erkennst sicher wozu es sinvoll ist Pointer zu verwenden, auch wenn das nich dem entspricht was du wissen wolltest *hä?*

--

Another1

...relaxing..atm =)
... und Schweiz suckt!


Dieser Beitrag wurde am 24.11.2001 um 16:10 von Another1 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
24.11.2001, 16:10
Prefect



Ich glaube doch, daß es da gewisse Mißkonzeptionen gibt.

Du reservierst in beiden Fällen Speicher. Nur im direkten Fall wird der Speicher als Teil der Klasse BasisB reserviert, während im indirekten Fall mit new der Speicher implizit reserviert wird, und in BasisB wird lediglich Speicher für den Pointer reserviert.

Ob du Pointer brauchst oder nicht hängt davon ab, wie flexibel du sein willst. Aber das habe ich ja eigentlich schon gesagt.

Um ein bißchen spezifischer zu werden:
Angenommen du willst state manipulierbar machen über eine Funktion SetState. Im direkten Fall würde die Funktion so aussehen:

Zitat:

void BasisB::SetState(State *newstate)
{
state = *newstate;
}

Im indirekten Fall könnte sie auch so aussehen:

Zitat:

void BasisB::SetState(State *newstate)
{
if (state) delete state;
state = newstate;
}

Damit würdest du dir das Hin- und Herkopieren ersparen, was besonders dann vorteilhaft ist wenn State sehr groß ist. Dafür mußt du aufpassen, weil ja newstate in den Besitz der BasisB-Instanz übergeht, d.h. der Programmteil, der SetState() aufruft, darf newstate nicht mehr per delete löschen. Zudem muß der aufrufende Programmteil newstate schon per new auf dem Heap alloziiert haben.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
008
24.11.2001, 16:24
Mazze



Achso...jo..ok!
Alles klar!

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche