Doppelpointer wirklich notwendig?
-
Hi,
ich habe folgenden Code geschrieben, aber bin mir unsicher, ob der Doppelpointer hier überhaupt notwendig ist.
Zumindest bei unloadFrame scheint es auch mit einem einfachen Pointer zu klappen. Bin mir daher ein bisschen unsicher...Habe die betreffenden Codestellen mit einem Kommentar versehen:
struct Frame { Frame *next; Frame *prev; }; void loadFrame(Frame **frm) // <-- Doppelpointer wirklich notwendig? { *frm = new Frame; (*frm)->next = NULL; (*frm)->prev = NULL; } void unloadFrame(Frame **frm) // <-- Doppelpointer wirklich notwendig? { delete *frm; } int main() { Frame *current; loadFrame(¤t); unloadFrame(¤t); }Danke :xmas1:
-
Du kannst auch Referenzen benutzen.
struct Frame { Frame *next; Frame *prev; }; void loadFrame(Frame*& frm) // <-- Doppelpointer wirklich notwendig? { frm = new Frame; frm->next = NULL; frm->prev = NULL; } void unloadFrame(Frame*& frm) // <-- Doppelpointer wirklich notwendig? { delete frm; } int main() { Frame *current; loadFrame(current); unloadFrame(current); }
-
Grundsätzlich ja. Allerdings würde ich hier eher zu einer Zeigerreferenz neigen:
struct Frame { Frame *next; Frame *prev; }; void loadFrame(Frame*& frm) { frm = new Frame; frm->next = NULL; frm->prev = NULL; } void unloadFrame(Frame*& frm) { delete frm; } int main() { Frame* current; loadFrame(current); // !Auch hier verändert! unloadFrame(current); // !Auch hier verändert! }Allerdings wenn man den Code an sich anschaut, dann klappt bei dir noch was anderes nicht. In C++ kann man sowas objektorientiert lösen und man sollte es auch. Dann musst du auf solche seltsamen Konstrukte, welche eher in C Anwendung finden, ganz verzichten.
class Frame { private: Frame* next; Frame* prev; public: Frame() : next(0) , prev(0) { } public: Frame* get_next() const { return next; } Frame* get_prev() const { return prev; } void set_next(Frame* next) { // ... } void set_prev(Frame* prev) { // ... } }; int main() { Frame frame; // <- Standardkonstruktor wird aufgerufen. // Speicherfreigabe läuft automatisch ab ... return 0; }Aber das sind absolute Grundlagen. Vielleicht ein C++ Buch kaufen oder runterladen?
- C++ Primer
- Thinking in C++ 1&2 (kann man runterladen)Grüssli
-

Hier sind weder Doppelzeiger notwendig noch Referenzen:struct Frame { Frame *next; Frame *prev; }; Frame* loadFrame() { Frame* frm = new Frame; frm->next = NULL; frm->prev = NULL; return frm; } void unloadFrame(Frame *frm) { delete frm; } int main() { Frame *current = loadFrame(); unloadFrame(current); }
-
Danke für eure Antworten

-
Dravere schrieb:
In C++ kann man sowas objektorientiert lösen und man sollte es auch.
Ja, aber dazu hättest Du aus struct nicht class machen müssen.
-
c++fan 2008 schrieb:
Dravere schrieb:
In C++ kann man sowas objektorientiert lösen und man sollte es auch.
Ja, aber dazu hättest Du aus struct nicht class machen müssen.
Hätte er nicht, aber ich finds auch übersichtlicher das teil nur dann struct zu nennen, wenn es eben eher einer zusammenfassung von variablen dient als einer klasse...
bb