[gelöst]QTimer timer oder QTimer *timer (Allgemeines)

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

[gelöst]QTimer timer oder QTimer *timer (Allgemeines)

Beitrag von Neuling_ »

Hallo,

kann mir jemand sagen, wann man einen Pointer anlegen sollte/muss und wann nicht.
Das irritiert mich immerwieder.
Und wo ich auch noch nicht dahinter gestiegen bin:

Code: Alles auswählen

QGridLayout *newLayout(this);
und

Code: Alles auswählen

QGridLayout *newLayout = new QGridLayout(this);
und dann wäre da noch

Code: Alles auswählen

newLayout = new QGridLayout;
= wann benutzt man was?


Gruß.
Zuletzt geändert von Neuling_ am 25. August 2009 12:12, insgesamt 1-mal geändert.
Qt 2009.05
Entw.-umgebung Qt-Creator
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

new legt dir immer nen zeiger an ....
new allokiert dir ein object dynamisch aufm freestore.
QGridLayout *newLayout(this);
da stimmt was nicht :-)
QGridLayout * ist der typ deiner variable, also nen zeiger auf nen gridlayout.
newLayout ist deine variable
mit (this) initialisiest du den wert. this ist der zeiger auf das Object, in dessen methode du grad bist. aber bist du grad in nem QGridLayout oder ner abgeleiteten klasse davon ?
QGridLayout *newLayout(this);
QGridLayout *newLayout = this;
waeren unter c++ gleichwertig.
aber glaub ned das du das gewollt hasst ^^
QGridLayout *newLayout = new QGridLayout(this);
das sieht eher nach Qt aus ....
du erzeugst dyn. nen neues QGridLayout. dabei nutzt du nicht den standardkonstruktor sondern einen speziellen.
das (this) hat hier also eine etwas andere bedeutung.
Qt hat eine interne hirarchie, und jedes von QObject abgeleite Object, kann mit einem parent, der auch vom typ QObject sein muss, instanziiert werden. intern pflegt die qt dann ne abhaengigkeitsliste, und sorgt dafuer, das wenn du einen parent loeschst, alle untergeordneten QObject-Childs mit geloscht werden. Das erspart dir sehr oft viel schreibarbeit, und führt zu mehr leserlichen code.
Weil du kannst so, instanzier mich und vergess mich gleich wieder Objecte, wie layouts und labels, die nur einmal instanzieierst und nie wieder anfasst, auch wirklich gleich wieder vergessen.
im traditionellen c++ muesstest listen fuer die objecte pflegen und die selber loeschen wenn nimmer gebraucht werden.

newLayout = new QGridLayout;
hier erzeugst du ein neues qGridlayout mittels Standardconstruktor und weisst es newlayout zu. newLayout sollte also vom typ zeiger auf QObject oder QGridLayout oder irgend ner klasse dazwischen sein
newlayout also die instanz auf die du mit der variable verweisst, hat aber dann kein QOBjectparent, und du musst es entweder selber loeschen (delete) oder ihm irgendwann mal ein parent zuweisen.

Glaub das wolltest du eigentlich nicht fragen oder ?
du wolltest eher auf den unterschied zwischen dynamischer allokierung (Freestore) und statischen variablen (Stack) eingehen, oder ?

Ciao ...
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag von Neuling_ »

Wow, vielen dank, war schon sehr informativ.
Glaub das wolltest du eigentlich nicht fragen oder ?
du wolltest eher auf den unterschied zwischen dynamischer allokierung (Freestore) und statischen variablen (Stack) eingehen, oder ?
:D du bist cool, schreibst mir den halben Roman obwohl du denkst, dass ich was anderes wissen möchte. ^^


Aber soweit ich deine Frage verstanden habe, muss ich dir zustimmen. ;)
Genau das wollte ich wissen. ;)

Würde mich über Teil II freuen :mrgreen:
Qt 2009.05
Entw.-umgebung Qt-Creator
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Neee, das waer ja unfair ^^
Unfair, weil andere viel Geld verdienen damit, anderen c++ beizubringen. ^^

und nen gutes Buch fuer c++ sollt man eh haben :-) da sollt sowas auch drinnestehen.

aber ich geb dir trotzdem ne kurze antwort auf deine frage:
wann benutzt man was?
unterschied zwischen dynamischer allokierung (Freestore) und statischen variablen (Stack)
iss ganz einfach
statisch immer dann wenn du kannst, dynamisch immer dann wenn du musst ! ^^

gruende fuer dyn. allokierung
- dein object isst so gross, das es ned aufn stack passt.
- Gueltigkeitsbereich, das object muss laenger existieren, als der scope, in dem du grad drinne bist
- in seltenen faellen, Abhaengigkeitsreduzierung (Pimpl Idom)
- Polymorphie, aka, du weisst zum compilieren noch gar ned, welche konkrete klasse Du an der stelle allokieren musst

das war einfach oder ?

Ciao ...
Neuling_
Beiträge: 83
Registriert: 8. August 2009 20:55

Beitrag von Neuling_ »

okey, ich versuche das mal soweit es geht zu verinnerlichen

..Buch müsste die Tage hoffentlich ankommen ;)

PS: Du verdienst Geld damit anderen C++ beizubringen? ;)
(aber das ist wohl eher was für den PN Bereich denke ich)
Qt 2009.05
Entw.-umgebung Qt-Creator
Antworten