Abfragen ob eine Variable = NULL ist (wie in Java)
-
Moin Moin
bei meiner Liste welche ich zu Übungszwecken gerade mal entwickle bin ich schooon wieder auf ein Problem gestoßen.
Ich komme aus Java und habe da immer Variablen oder Objekten NULL zugewiesen bevor sie was vernünftiges bekommen haben um abfragen zu können ob sie halt NULL sind. Wenn sie einfach keinen Wert haben gibts ja Fehler. Ich mach mal ein Beispiel sons versteht mich niemand.
Mein Kettenglied hat drei variablen:
cKettenglied davor; cKettenglied danach; int inhalt;wenn ich jetzt den inhalt mit getInhalt erfrage, möchte ich gerne abfragen ob überhaupt mal etwas gespeichert wurde. Aus diesem Grund hab ich in Java im Konstruktor folgendes gemacht:
JAVA Code: public cKettenglied() { inhalt = null; davor = null; danach = null; }Damit kann ich abfragen ob überhaupt etwas festgelegt wurde ohne einen fehler zu bekommen. Einfach mit
if(inhalt != null){...}Wie mache ich das in C++. Ich hab schon ein wenig darüber nachgedacht und könnte eventuell einfach erst einmal mit Nullzeigern arbeiten, welche ich dann auf den Inhalt bzw die Kettenglieder davor und danach zeigen lasse sobald diese festgelegt werden. Müsste so ja gehen.
Trotzdem wollte ich fragen ob man das so macht. Ich möchte mir ja nicht am Anfang einen grausamen Stil angewöhnen oder nachher auf Probleme stoßen.
Hoffe ihr könnt helfen.
Grüße
Martin
-
if(inhalt != NULL) ...
-
Für solche Sachen ist es durchaus üblich 0 Zeiger zu nehmen. Zumindest bis wir
nullptrhaben.
-
Prinz Martin schrieb:
Ich komme aus Java und habe da immer Variablen oder Objekten NULL zugewiesen bevor sie was vernünftiges bekommen haben...
Objekten (Im Sinne der OOP) kannst du in C++ nicht NULL zuweisen, nur Zeigern (Java-Referenzen sind mit den C++ Zeigern vergleichbar, wenn auch mit einer "sichereren" Syntax). Und einen int-Wert null zuzuweisen, macht auch in java wenig Sinn soviel ich weiß (Zumindest glaube ich mich zu erinnern das Basisdatentypen wie int auch in Java Werte sind).
In deinen Beispiel könnte ein Kettenglied wie folgt aussehen:
class Kettenglied { Kettenglied * davor; Kettenglied * danach; int inhalt; Kettenglied() : davor(NULL), danach(NULL), inhalt(0) { } };Prinz Martin schrieb:
if(inhalt != null){...}Dies ist, wie soviel ich weiß (oben schon angesprochen) auch in Java auf den int-Wert Unsinn (In C++ wäre es nur ein != 0 Vergleich, und 0 ist für ein int ein ganz normaler Wert), auf die Zeiger wiederum okay.
-
Oh stimmt das mit dem Integer hab ich jetzt so übernommen meine Java Liste war keine Integer Liste sondern da war der inhalt vom typ Object.
Gut, dann werde ich das mal mit Nullzeigern machen.
Ich wollt nur sichergehen, dass ich mich da nicht in etwas verrenne

also ich fasse noch mal zusammen:
ich habe die zeiger:
cKettenglied * davor;
cKettenglied * danach;und ich würde jetzt noch zwei variablen machen
cKettenglied davor;
cKettenglied danach;und die zeiger lasse ich erstmal auf NULL zeigen. Sobald dann Kettenglieder angegeben werden für davor und danach lasse ich dann *davor und *danach auf davor und danach zeigen?
kommt mir irgendwie krumm vor

grüße
Martin
-
Edit:...
-
Nein. Du hast dann da keine automatische Objekte mehr. Das verketten mit den Objekten geschieht dann beim Einfügen/Entfernen.
Nehmen wir einfach mal an, dass bei dir ein Kettenglied den Anfang einer Liste darstellt. Dann ist dies representierte Liste leer, wenn davor und danach 0 enthalten. (Keine Vorgäner oder Nachfolger, also ist die Liste leer, respektive besteht nur aus diesem ersten Element).
Wenn du jetzt ein Knoten anfüngen möchtest erstellest du ganz einfach per new ein neues Kettenglied und läst davor auf das erste zeigen und im ersten hängst du den Zeiger auf das soeben erstellte Element.
-
ach so stimmt. ich bin an zeiger noch nicht gewöhnt.
ich hätte jetzt die zeiger auf die "lokalen" variablen davor und danach zeigen lassen und mir die dann per get geholt und per set geändert und wäre immer diesen umweg gegangen

blöde gewohnheiten :-D.
Aber ich denke wenn ich einfach mal ein paar wochen datenstrukturen programmiere werde ich mich schon dran gewöhnen

Danke für die Hilfe hier.
Grüße
Martin
-
Prinz Martin schrieb:
Aber ich denke wenn ich einfach mal ein paar wochen datenstrukturen programmiere werde ich mich schon dran gewöhnen

Damit rennst du nur gegen Wände. Lern die Grundlagen! Kauf oder leih dir ein anständiges Buch! Und vergiss endlich Java!
http://www.c-plusplus.net/forum/viewtopic-var-t-is-251551.html
C++ lernt man nicht mit ein wenig anwenden und rumraten. Damit schadest du nur dir selbst und wirst nie richtig C++ lernen.
Grüssli
-
Hehe ich will Java aber nicht vergessen
nicht vorm Studium und auch nachher nicht dann brauch ichs wahrscheinlich 
aber ich werde versuchen Java Herangehensweisen möglichst zu verdrängen. Deshalb frag ich ja auch hier wie mans am besten macht und bastel mir nicht mit c++ einen Ersatz für Java Funktionalitäten.
Ich werde jetzt erst mal Zeiger vertiefen und eventuell komm ich auch an ein Buch ran.
Allerdings ist es denke ich nicht sooo schlecht direkt einfache Aufgaben anzugehen. Beispielprogramme sind ja immer ganz schön aber sie werfen halt wirklich nicht so viele Fragen auf.
Dieses "vor die Wand" rennen, stößt mich auf fragen, auf die ich sonst nie gekommen wäre.Das Ziel ist auch nicht wirklich C++ in seiner gesamten Komplexität zu erlernen sondern schon einmal Grundlagen zu bekommen und sich einfach ein wenig anderen Möglichkeiten öffnen. Im Studium brauch ichs dann sowieso. Da wird es also vertieft.
Aktuell habe ich halt einfach die Zeit.Grüße
Martin
-
Prinz Martin schrieb:
Deshalb frag ich ja auch hier wie mans am besten macht und bastel mir nicht mit c++ einen Ersatz für Java Funktionalitäten.
Aber genau das ist eben falsch! Du willst Java durch C++ ersetzen, das geht aber nicht! Du kannst in C++ nicht wie in Java programmieren. Du kannst die Funktionalitäten nicht einfach 1:1 ersetzen. In C++ programmiert man grundsätzlich anders als in Java. Wenn du einfach nur 1:1 eine Funktionalität nach der anderen ersetzt, lernst du kein vernünftiges C++.
Prinz Martin schrieb:
Allerdings ist es denke ich nicht sooo schlecht direkt einfache Aufgaben anzugehen. Beispielprogramme sind ja immer ganz schön aber sie werfen halt wirklich nicht so viele Fragen auf.
Stimme ich dir definitiv zu, nur braucht man zuerst die Grundlagen dazu. Es bringt dir viel mehr, wenn du zuerst die Grundlagen lernst und dann zu den gelernten Grundlagen Beispiele machst. So wie du jetzt herangehst, hüpfst du wild und unkontrolliert durch die Sprache und lernst nicht mal die Grundlagen richtig. Da entsteht ein reiner Flickenteppich, was sehr gefählich sein kann in C++, wo es SEHR WICHTIG ist, dass man die Grundlagen verstanden hat. In Java ist es nicht all zu schlimm, in C++ kannst du dir allerdings ein Bein wegschiessen, wenn du die Grundlagen nicht verstehst.
Du willst nur die Grundlagen von C++ lernen. Dafür ist es perfekt mit einem Buch zu lernen. Der C++ Primer (gegen 1000 seitiges Buch) lernt dich nur die Grundlagen! Gegen 1000 Seiten! Nur Grundlagen! Vielleicht verstehst du jetzt, wie wichtig und umfangreich die Grundlagen in C++ sind.
Grüssli
-
Ich werd mal meine Freundin drauf ansetzen mir das aus ner Bibliothek in Köln auszuleihen ich glaub die katholisch öffentliche Bücherei um die Ecke die jeden donnerstag zwischen 16 und 18 uhr geöffnet hat führt das nicht

zu der ersten aussage:
ich hab da gesagt dass ich mir NICHT den Ersatz basteln will ;-). Sonst wär die Liste wohl schon längst fertig ;-).
Ich muss wohl wirklich noch deutlich mehr umdenken als ich bisher dachte. In Java kommt es mir so vor als müsse man sich um weniger kümmern
aber vllt bin ichs auch nur gewöhnt 
Grüße
Martin
-
Ich habe mal 'nen alten Kommentar über Unterschiede zwischen C++ und Java herausgekramt, der hier auch zum Thema passt:
Der wichtigste Unterschied zwischen Java und C++ ist erstmal der, dass
in Java Variablen von Klassentypen in Wirklichkeit "Referenzen" und
nicht die Objekte selbst sind. Java-Referenzen sind vergleichbar mit
Zeigern in C++, wobei statt dem Punkt (.) der Pfeiloperator (->) für
den Elementzugriff benutzt wird. Diese implizite Indirektion
(Referenz<->Objekt) gibt es in C++ nicht. In C++ ist der Objektbegriff
auch nicht auf Klassentypen beschränkt. Objekte sind die "im Speicher
liegenden Dinger", die durch Variablen, Zeiger oder Referenzen
referenziert werden. Indirektion ist explizit (*,&).Das nächste, was man wissen sollte ist, dass man in C++ selbst für das
Löschen von Objekten verantwortlich ist, die man per new oder per
new[] angelegt hat. Man kommt aber an vielen Stellen ohne new/delete
bzw new[]/delete[] aus, indem man die Verantwortlichkeit für die
Verwaltung der Lebenszeit von Objekten an andere Objekte abgibt.
Beispielsweise kümmern sich die Standardcontainer um alle ihre
Elemente und man kann -- was das Erzeugen, Kopieren und Zuweisen
angeht -- solche Standardcontainer wie "normale" Typen (int, double,
etc) behandeln.
-
Prinz Martin schrieb:
...ich bin an zeiger noch nicht gewöhnt...
Doch - Du weißt es nur nicht. "Java-Referenzen" sind fast dasselbe.
"auto Variablen" (also solche, die automatisch erzeugt und vernichtet werden) sind das, was Du nicht kennst.
Ich verweise deshalb noch einmal auf meine Themenliste, die Du angehen solltest.Oder sagen wir mal anders: Du wirst Dich damit beschäftigen (wenn Du weiter C++ programmierst)
- entweder explizit, kurz und effektiv (durch Lesen und gezieltes Lernen)
- oder implizit, mühsam und lückenhaft (durch trial&error wie jetzt).
:p
Ich würde Dir ja zum ersten Weg raten....
Prinz Martin schrieb:
...In Java kommt es mir so vor als müsse man sich um weniger kümmern...
Das kommt Dir nur so vor, weil in Java viel Aufwand in spätere Phasen (Test, Deployment) verlagert wird.
Gruß,
Simon2.
-
Prinz Martin schrieb:
Ich werd mal meine Freundin drauf ansetzen mir das aus ner Bibliothek in Köln auszuleihen...
Falls die das haben (und zwar -wichtig- bitte in einer aktuellen Ausgabe), zudem ist der C++ Primer leider inzwischen vergriffen. Eine alternative ist "Thinking in C++" (das sind 2 Bücher [Volume 1+2], die auch legal kostenlos im Internet verfügbar sind).
Prinz Martin schrieb:
In Java kommt es mir so vor als müsse man sich um weniger kümmern

Java verbirgt vieles vor dem Entwickler, das du in C++ händisch erledigen musst. Ein wesentlicher Unterschied ist wie schon erwähnt das Java-Referenzen eigentlich Zeiger sind (und auch nichts mit den C++ Referenzen, die es neben den Zeigern noch gibt, zu tun haben). Wohl alles was in C++ mit dynamischen Speicher zu tun hat läuft über Zeiger (Auch wenn dies Teilweise durch Containerklassen etc. vor dem Anwender verborgen wird).
-
dann werde ich jetzt erst mal "in c++ thinken" ;-).
Aber erst werd ich mir deine Liste mal anschauen. Irgendwie war die untergegangen :-D. Wenigstens akzeptiert Ubuntu jetzt meine Fernsehkarte und ich kann mich "ganz" auf c++ konzentrieren ;-).
UUUUUuuund ein wenig Try & Error zwischendurch

Grüße
Martin