Wann der Zeiger auf eine Klasse verwendet werden soll und wann sie nur als Variable instanziiert werden soll

8

Ich bin irgendwie verwirrt. Das Beste, was ich finden konnte, war das Lesen des cplusplus.com-Tutorials und alles, was sie über Zeiger auf Klassen zu sagen haben.

"Es ist durchaus zulässig, Zeiger zu erzeugen, die auf Klassen verweisen. Wir müssen lediglich berücksichtigen, dass eine Klasse nach ihrer Deklaration zu einem gültigen Typ wird, sodass wir den Klassennamen als Typ für den Zeiger"

verwenden können

Was mir nicht sagt, wann ich sie über die normale Instanziierung hinaus verwenden soll. Ich habe die - & gt; Operator oft, und schaute auf einige Codes, aber kann nicht wirklich entschlüsseln, warum sie es getan haben.

Generische Beispiele werden geschätzt; aber speziell im Zusammenhang mit der GUI-Programmierung. Es ist, wo ich zuerst darauf gestoßen bin.

%Vor%

Warum nicht

%Vor%

(Es kompiliert nicht, wenn ich den Beispielcode zu diesem ändern und es versuchen, aber Sie erhalten den Punkt)

Vielen Dank im Voraus

    
Enders 04.01.2011, 22:47
quelle

5 Antworten

9

Eine gute Möglichkeit, darüber nachzudenken, wann ein Objekt (ohne Zeiger) im Gegensatz zu einem Heap-allokieren (Zeiger) stapeln soll, besteht darin, darüber nachzudenken, wie lange dieses Objekt leben soll. Wenn Sie das Objekt als lokale Variable auf den Stack setzen, wird es aufgeräumt und hört auf zu existieren, sobald die Funktion zurückkehrt. Wenn das Objekt den Funktionsaufruf, der es erstellt hat, überleben soll, legen Sie es auf den Heap.

Am Beispiel des Grid-Layouts glaube ich, dass die Pointer-Version besser geeignet ist, da nach dem Funktionsaufruf, der das Layout erzeugt, das Layout immer noch herumliegen soll. Andernfalls würde das Layout nur so lange existieren, wie die Funktion ausgeführt wird.

    
templatetypedef 04.01.2011, 22:49
quelle
2

Ein guter Grund ist Polymorphismus und dynamisches Dispatching. Wenn Sie einen Zeiger auf einen Basisklassentyp deklarieren und ihn einer Instanz eines Subtyps zuweisen, können Sie verschiedene Versionen der Methode aufrufen. In den obigen Beispielen gibt es wahrscheinlich einen Basistyp (vielleicht QTLayout?), Mit dem der Zeiger deklariert werden kann.

Ein anderer Grund ist eine Situation, in der Ihr Objekt über den Rahmen der Methode, in der es deklariert ist, "leben" soll. Ihr zweites Beispiel ist auf dem Stapel zugeordnet und wird beim Verlassen freigegeben.

    
Uri 04.01.2011 22:51
quelle
1

Die eigentliche Frage ist nicht die Verwendung von Zeigern, sondern die dynamische Zuordnung. Durch das dynamische Zuweisen eines Objekts (mit new ) können Sie die Lebensdauer des Objekts steuern. Wenn Sie das Objekt in einer Funktion erstellen möchten, es aber nicht mehr existieren soll, sobald die Funktion beendet ist, dann ist die dynamische Zuordnung für Sie.

Normalerweise sehen Sie Zeiger, die auf dynamisch zugewiesene Objekte zeigen (da dies der beste Weg ist, mit ihnen umzugehen, da Referenzen eine plumpe Alternative sind); Sie können jedoch auch einen Zeiger auf ein Objekt mit automatischer Speicherdauer haben:

%Vor%

^ In diesem Beispiel verwende ich den automatischen Speicher (indem ich das Objekt als eine "normale Variable" erstelle), so dass das Objekt am Ende des umschließenden Blockbereichs zerstört wird (wahrscheinlich das Ende von die Funktion oder vielleicht einen bedingten ( if ) Block, aber immer noch einen Zeiger damit!

Hoffe das hilft etwas.

    
quelle
0

Ist QGridLayout eine Klasse? Der zweite sollte gut funktionieren, wenn Sie die Tippfehler behoben haben. Du hast gesagt, es kompiliert nicht. Sollten wir den Fehler erraten?

Das Objekt als lokale Instanz zu erstellen ist in Ordnung. Das einzige potentielle Problem ist, wenn die Klasse groß ist, da dies dazu neigt, den Stapelraum übermäßig zu verbrauchen.

Beachten Sie, dass ein Objekt den gesamten benötigten Speicher zuweisen kann und sich nicht auf die Größe des Stapels auswirkt.

    
Jonathan Wood 04.01.2011 22:51
quelle
0

Verwenden eines ptr zu einer Klasse versus Instanziierung auf dem Stapel erlaubt auch bedingte Existenz des Objekts, dh der Wert NULL, wenn Sie das als Fall benötigen.

    
no-op 04.01.2011 23:57
quelle

Tags und Links