Kommt man ohne Zeiger aus?
Kommt man ohne Zeiger aus?
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!
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!
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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.
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.
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.
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.
Linux, das längste Text-Adventure aller Zeiten
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
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
Re: Kommt man ohne Zeiger aus?
Ich fuerchte, Du brauchst einen neuen Zutraeger. Das ist Unsinntaraquedo hat geschrieben:Hallo,
mir wurde zugetragen, dass man - wahrscheinlich - mit Qt in der Lage ist komplett ohne Zeiger und Zeigerarithmetik auszukommen. ...
Nur weil man Zeiger als "Referenz" bezeichent, sind sie nicht verschwunden. "java null pointer exception" liefert immerhin 5.4 Millionen Treffer bei Google...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?).
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
)
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.
Hat mich mal etwas Nerven gekostet, als ich versucht hab ein LogWidget als Singleton zu realisieren
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.
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!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)
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?
Was sich aber mit dem Begriff "Smartpointer" imho ned beisst !Sobald irgend etwas nen parent hat, wird es rigoros weggeputzt!
Smartpointer bezieht sich weniger auf die Loeschregeln, sondern eher auf die erweiterung der Funktionalitaet !
std::auto_ptr iss IMHO auch nen Smartpointer. Und der putzt auch alles weg ^^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.
Das die QOBjects ned wirklich als smartpointer anzusehen sind:
stattdessen musst du dir den reinen zeiger merken, bzw den aus dem übergeordneten QOBject mittels zugriffsfunktionen extrahieren....lassen sich aber wie normale Zeigervariablen benutzen ...
...mit zusätzlichen Funktionen und Eigenschaften...
und das parent bietet auch keine weiterern funktionen zu seinem child an ...
Ciao ....