Seite 1 von 2

Kommt man ohne Zeiger aus?

Verfasst: 28. November 2009 11:57
von taraquedo
Hallo,

mir wurde zugetragen, dass man - wahrscheinlich - mit Qt in der Lage ist komplett ohne Zeiger und Zeigerarithmetik auszukommen. Programmiersprachen wie Java verfolgen ja genau diesen Ansatz und ich kann die Vorteile gut verstehen: Selbst als erfahrener Programmierer macht man mal einen Flüchtigkeitsfehler, der schwer zu bemerken und finden ist, jedoch fatale Wirkungen haben kann (wer hatte nicht schon mal einen schwer nachzuvollziehenden Segmention fault?).

Aber wie geht das? Hat da jemand mal Beispielcode zu oder gibt es einen Artikel wie man sich das vorzustellen hat? Einige Dinge verstehe ich nicht, wie ich die ohne Zeiger machen soll. Ich meine durch die vielen Jahre bin ich vielleicht etwas eingefahren in meiner Denkweise. Die würde ich gerne mal erweitern. Hat jemand dazu Tipps?

Grüße!

Verfasst: 28. November 2009 14:57
von Christian81
Qt benutzt wie alles andere in C++ auch Zeiger - ohne geht es nunmal in C++ nicht. Man kann sie so weit wie möglich vermeiden, ja.

Verfasst: 28. November 2009 14:58
von franzf
Qt ohne Zeiger geht nicht. Definitiv.
Denn schon deine parent()s werden nur als Zeiger gespeichert, Funktionen liefern oft Zeiger zurück.
Wer kommt denn eigentlich auf sowas, komplett auf Zeiger zu verzichten?!?

Versuch mal Basisklassenobjekte (also keine Zeiger) in ner Liste abzuspeichern. Füge ein abgeleitetes Objekt ein.
Ab jetzt hast du selbst bei abgeleiteten Objekten in der Liste nur noch den Basisklassenanteil zur Verfügung!!!
Ein dynamic_cast auf einen solchen liefert einen std::bad_cast.
Ein static_cast liefert einen uninitialisierten Rest zurück...
Einzige Lösung -> Pointer in die Liste!

Außerdem ist QObject nicht kopierbar. Ein push_back in ne Liste kopiert ein Objekt immer. Also kannst du QObject-Objekte nicht in ner Liste abspeichern. Wie willst du jetzt children verwalten?
Und wenn in nem SIGNAL ein QObject (oder davon abgeleitet) als Parameter übergeben wird? Diese werden intern als Kopie abgespichert, damit sie erhalten bleiben, bis alle angebundenen SLOTS abgearbeitet wurden ->geht wieder nicht ohne pointer.

Verfasst: 30. November 2009 09:53
von RavenIV
So am Rande erwähnt:
Man kann auch in anderen Programmiersprachen direkt mit Zeigern arbeiten. Dies geht z.B. in Java und Delphi sehr gut. Intern wird eh das meiste über Zeiger abgewickelt.

Man kann auch in C/C++ ohne Zeiger leben. Meistens merkt man eben nicht, dass man Zeiger verwendet.

Verfasst: 30. November 2009 19:45
von phlox81
Also man kann schon einiges ohne Zeiger machen.
Aber Qt arbeitet recht viel mit Zeigern, und auch sonst ist das in C++ nicht unüblich.
Man muss halt sorgfältig sein, und häufig kann man auch eine Referenz statt einem Zeiger verwenden, wobei Referenzen für mich den Nachteil haben, das sie invalide werden können, wenn das Objekt zerstört ist, genauso wie Pointer.
Einen Pointer kann man aber auf NULL setzen, und somit ist der unterschied zwischen Referenz und Pointer eigentlich nur der, das eine Referenz nicht NULL sein kann.
Beides mal muss man vom Design her sicherstellen, das der Inhalt valide ist.

Und für die sichere Lagerung und besseren Umgang mit Pointer gibt es ja Smartpointer.
Nähere Infos zu Qt und Smartpointern findest du hier: http://labs.trolltech.com/blogs/2009/08 ... s-qt-have/

phlox

Verfasst: 1. Dezember 2009 17:35
von Psychomax
Damit die "Garbage Collector" Funktion funktioniert, kommt man um Zeiger fast net herum...

Verfasst: 1. Dezember 2009 17:58
von AuE
Er hat das Unwort benutzt *angst* :shock:

Re: Kommt man ohne Zeiger aus?

Verfasst: 1. Dezember 2009 22:26
von grog
taraquedo hat geschrieben:Hallo,

mir wurde zugetragen, dass man - wahrscheinlich - mit Qt in der Lage ist komplett ohne Zeiger und Zeigerarithmetik auszukommen. ...
Ich fuerchte, Du brauchst einen neuen Zutraeger. Das ist Unsinn ;-) Zeiger sind integraler Bestandteil der Sprache (und auch nicht von Haus aus "boese").
taraquedo hat geschrieben:Programmiersprachen wie Java verfolgen ja genau diesen Ansatz und ich kann die Vorteile gut verstehen: Selbst als erfahrener Programmierer macht man mal einen Flüchtigkeitsfehler, der schwer zu bemerken und finden ist, jedoch fatale Wirkungen haben kann (wer hatte nicht schon mal einen schwer nachzuvollziehenden Segmention fault?).
Nur weil man Zeiger als "Referenz" bezeichent, sind sie nicht verschwunden. "java null pointer exception" liefert immerhin 5.4 Millionen Treffer bei Google...

Verfasst: 1. Dezember 2009 22:59
von Psychomax
Wieso Unwort?! Das musst mir jetzt mal erklären ;)

Verfasst: 2. Dezember 2009 07:51
von AuE
Garbage Collector erinnert mich immer an Java/C# ==> der GC funzt einfach nicht. Ausserdem hasse ich Sprachen wo es kein Gegenstück zu new gibt ;-)
Deshalb unwort!

Das was Qt macht erinnert mich eher an die Arbeitsweise von Smartpointer.

Im Endeffekt das gleiche ;-)

Verfasst: 2. Dezember 2009 09:04
von franzf
Es ist ja nicht mal ein SmartPTR... Wenn ein QObject gelöscht wird, werden automatisch alle children gelöscht.
Hat mich mal etwas Nerven gekostet, als ich versucht hab ein LogWidget als Singleton zu realisieren ;) (Jaja, sowas ist Käse und doof :P)
Kaum war das Ding in nem Layout, und das zugehörige Fenster wurde glöscht, war auch mein LogWidget überm Jordan... Obwohl die Instanz selber noch gar nicht zum Löschen freigegeben wurde. Also auch keine Garbage-Collection.

Und Garbage-Collection als rein böse abzustempeln ist auch nicht das Wahre. Einziger Nachteil ist halt, dass man nicht weiß, wann jetzt wirklich gelöscht wird. Bei Python gibt es das "del". Der Name ist dann nicht mehr mit einer Referenz belegt - Das Objekt wird aber durchaus noch existieren, das __del__ (~Destruktor) ist noch nicht aufgerufen!

Man muss sich einfach von dieser Vorstellung (und der Abhängigkeit dieses Mechanismus im Programm) freimachen. Dann kann man durchaus damit leben.

Verfasst: 2. Dezember 2009 09:59
von AuE
Nicht bei Anwendungen die länger (durchgehend) laufen...da kann die Garbage Collection auch nach nen Monat mal zum BlueScreen führen!

Wenn die Referenz weg ist alle children löschen ist doch quasi nen Smartptr (abstrahiert klar... aber man kann es sich in etwa so vorstellen)

Verfasst: 2. Dezember 2009 10:11
von franzf
AuE hat geschrieben:Wenn die Referenz weg ist alle children löschen ist doch quasi nen Smartptr (abstrahiert klar... aber man kann es sich in etwa so vorstellen)
Ein SmartPointer wäre es dann, wenn geprüft werden würde, ob noch irgend wer eine Referenz auf meinen Pointer speichert. Und das macht Qt nicht! Sobald irgend etwas nen parent hat, wird es rigoros weggeputzt!

Vllt. ist in der AUflistung ja was dabei was dir gefällt ;)
http://www.digitalmars.com/d/2.0/garbage.html

Und wieso kann GarbageCollection zu nem Blueescreen führen? Und auch unter Linux?

Verfasst: 2. Dezember 2009 11:04
von RHBaum
Sobald irgend etwas nen parent hat, wird es rigoros weggeputzt!
Was sich aber mit dem Begriff "Smartpointer" imho ned beisst !
Smartpointer bezieht sich weniger auf die Loeschregeln, sondern eher auf die erweiterung der Funktionalitaet !
ntelligente Zeiger oder Smartpointer werden in vielen gängigen Programmiersprachen wie etwa C++ verwendet. Es handelt sich um spezielle Zeiger, die gegenüber einfachen Zeigervariablen mit zusätzlichen Funktionen und Eigenschaften ausgestattet sind. Intelligente Zeiger erweitern also einfache Zeiger und statten sie mit mehr Funktionalität aus, lassen sich aber wie normale Zeigervariablen benutzen.
std::auto_ptr iss IMHO auch nen Smartpointer. Und der putzt auch alles weg ^^
Das die QOBjects ned wirklich als smartpointer anzusehen sind:
...lassen sich aber wie normale Zeigervariablen benutzen ...
...mit zusätzlichen Funktionen und Eigenschaften...
stattdessen musst du dir den reinen zeiger merken, bzw den aus dem übergeordneten QOBject mittels zugriffsfunktionen extrahieren.
und das parent bietet auch keine weiterern funktionen zu seinem child an ...

Ciao ....

Verfasst: 3. Dezember 2009 00:58
von Psychomax
Na da habe ich jetzt aber was losgetreten. Aber interessant zu lesen. :-) Ich mag Singletons! ;-) Die sind so schön einzigartig! :-D