Variable vom Typ Object in C++
-
Moin Moin
ich bringe mir gerade C++ bei und kann schon Java (3 Jahre Informatik LK in der Schule). Um mich in C++ einzufinden will ich erst mal die gängigen Sortieralgorithmen / Datenstrukturen programmieren.
Aktuell bin ich bei der Liste.
in Java hab ich das folgendermaßen gemacht
die Klasse cKettenglied hat 3 Variablen:
cKettenglied kettenglied_vorher;
cKettenglied kettenglied_nachher;
Object beliebige_referenz_auf_ein_object;set und get für alles.
Damit kann ich die Liste universell nutzen, ohne den typ der zu speichernden Daten schon vorher zu kennen.
Wie kann ich das in C++ realisieren? gibt es da auch einen variablen typ, welcher jeden object typ erst mal aufnehmen kann. Beim auslesen muss man dann natürlich per type casting sagen was man da gespeichert hat.
Ich hoffe ihr könnt mir mal wieder helfen

Grüße
Martin
-
Den Typ "Object" gibt es in C++ nicht. In C++ nutzt man dafür Templates (in Java wären das Generics).
C++ hat dafür bereits etwas fertig in der Standard Template Library:
std::list<Type>
-
Das es die Liste schon gibt ist mir klar
Ich machs halt um zu lernen. Als nächstes kommen dann bin trees etc.Aber dann werd ich mal unter Templates schauen. Was du jetzt mit Javas Generics meinst weiß ich nicht, muss ich auch mal googlen. In java gibts auf jeden Fall den Typ Object
Grüße
Martin
-
Generics sind Strukturen, die mit jedem beliebigen Typ funktionieren, den Typ musst du jeweils angeben. Die Generics sind dem Object auch vorzuziehen, da du bei dem Object auch immer wieder einen potentiell gefährlichen Downcast durchführen musst.
In Java wäre dies ein Beispiel für Generics:
List<Integer> myIntList = new LinkedList<Integer>();Diese Liste würde nur Integer und davon abgeleite Klassen annehmen, nicht jedoch Klassen wie Object.
-
Prinz Martin schrieb:
Was du jetzt mit Javas Generics meinst weiß ich nicht, muss ich auch mal googlen.

Nicht dein Ernst? Seit Java 1.5 gibt es Generics, das ist ja nun schon bald 6 Jahre her!Prinz Martin schrieb:
Aber dann werd ich mal unter Templates schauen.
Darf ich dir einen Tipp geben? Kauf dir ein anständiges C++ Buch und arbeite es durch. In deinem Stadium könnten Templates ein wenig zu schwer sein. Auch solltest du keinesfalls denken, dass Java und C++ sehr ähnlich sind. Das wird oft behauptet und sieht auf den ersten Blick so aus, aber tatsächlich sind es sehr unterschiedliche Sprachen. Wenn du anständig C++ lernen willst, dann vergiss am besten alles über Java und fang bei Null an in C++.
Bücher findest du hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-251551.htmlGrüssli
-
Tja wir haben Generics nie benutzt. Wir kamen immer mit Object zurecht. Auch ohne Downcast. Ich hab mich ja auch nie in die tiefen von Java hineinbegeben, da ich das einfach nicht brauchte.
wir sollten ne liste nen baum etc machen und ham das gemacht. Es hat funktioniert, wir warn fertig und konnten minigolf im internet spielen aber das ist eine andere geschichte ;-).
Dass C++ und Java ähnlich sind, davon gehe ich gar nicht wirklich aus ;-).
also ich hab mir jetz mal das anlegen von Klassen beigebracht.
Klappt soweit ganz gut. Nur gibt es ja scheinbar dreierlei arten wie man das machen kann.Typ1: Alles in einer Datei. Dabei direkt komplett definieren was die Methoden etc tun sollen. Davon wird aber ja abgeraten, da die Methoden dann als inline Methoden benutzt werden.
Typ2: Alles in einer Datei aber trotzdem erst das Anlegen der Klasse und dadrunter dann die genaue definition der Methoden.
Typ3: eine klasse.h headerdatei und dann das ganze definieren in einer klasse.cpp Datei.
Ich habs jetzt mal mit 2 unterschiedlichen Dateien gemacht aber ich weiß nicht wirklich ob sich Typ2 und Typ3 unterscheiden.
Da denk ich jetzt zuerst drüber nach und dann kommen Templates
Grüße
Martin
-
Prinz Martin schrieb:
Tja wir haben Generics nie benutzt. Wir kamen immer mit Object zurecht. Auch ohne Downcast.
Das darf man arg bezweifeln. Wenn du in eine Liste aus Objects etwas anderes rein tust, geht das ohne Probleme. Du kriegst aber nur ein Object wieder heraus. Es sei denn, du machst einen Downcast auf den tatsächlichen Typ.
-
Typ1 und Typ2 sind im Prinzip das gleiche.
Bei Typ3 sind nach aussen nur die Deklaration der Methoden bekannt. Du versteckst die Implementierung in einer cpp Datei, die sonst keiner sieht.
Das sollte man eigentlich immer so machen, es sei denn man will tatsächlich inline Funktionen oder hat Templates.Ansonsten sollte man immer so wenig wie möglich in einer Headerdatei schreiben, so wenig wie möglich andere Dateien inkludieren, keine 'using namspaces' keine Implementierungen. Jede Änderung an einem Header führt nämlich auch zu einer Änderung aller Dateien, die diesen inkludieren.
Man benutzt auch oft das sog. Pimpl Idiom, bei dem man alles Daten der Klasse hinter einem Zeiger auf die Implementierung versteckt.
-
Prinz Martin schrieb:
...Dass C++ und Java ähnlich sind, davon gehe ich gar nicht wirklich aus ;-). ...
Das ist schonmal gut!
Aber ich vermute, dass Du die Unterschiede unterschätzt. Ist nichts Schlimmes - geht vielen Java->C++-Umsteigern so. Besonders, wenn Java die erste Programmiersprache war, ist einem noch gar nicht bewusst, wie tief man in "der Denke" dieser speziellen Programmiersprache steckt.Es gibt im Internet (und auch hier im Forum irgendwo) ganz gute Auflistungen der größten "Umsteigerhürden"/Unterschiede zwischen diesen beiden Sprachen. Ich würde Dir raten, Dich zuallererst (in der u.g. Reihenfolge) zu beschäftigen mit:
- dem gesamten Komplex "auto Variablen" (auch gerne "Stack Variablen" genannt), Destruktoren, Lebenszeiten, RAII, ...
- C++-Referenzen (in wichtigen Punkten ganz anders als Java-Referenzen; letztere ähneln eher C++-Zeigern)
- StdLib; Container(vector, map, list, ...), Algorithmen, Iteratoren, ... hier gibt's ganz gute Informationen dazu.
- const
- operator-Überladungen (besonders operator<<())
- Metaprogrammierung mit templates
Hinter all diesen Themen steckt mehr als nur ein "So wendet man das an", sondern eine komplette "Denkart", die ich jeweils als sehr anders empfinde als bei Java.
Aaaaber: Das sind enorme Horizonterweiterungen, die man sich nicht entgehen lassen sollte, wenn man an Programmierung interessiert ist.Templates sind zwar sehr interessant und auch sehr neu, aber eher "Brauner-Gürtel-Themen" ;). Sie zu nutzen (wie z.B. in der StdLib) geht schnell und unkompliziert und vermittelt schon einen kleinen Einblick - aber selbst vernünftig (nichttriviale) Metaprogrammierung zu betreiben, ist alles Andere als trivial. Da würde ich mich nicht zu früh reinwerfen (gerade, wenn man in den davorliegenden Themen noch nicht ausreichend sattelfest ist).
Gruß,
Simon2.
P.S.: Ein Thema konnte ich oben nicht richtig einordnen, weil es irgendwie alles betrifft: "Lass den Compiler soviel Arbeit tun wie möglich"; wo man in Java sich sehr auf Laufzeitprüfungen und Tests verlässt, versucht man in C++, möglichst alles bereits vom Compiler prüfen/sicherstellen zu lassen. Ich will nicht sagen, dass eines besser ist - ist einfach anders.
-
pumuckl schrieb:
Prinz Martin schrieb:
Tja wir haben Generics nie benutzt. Wir kamen immer mit Object zurecht. Auch ohne Downcast.
Das darf man arg bezweifeln.
Vielleicht sollte man die Aussage "kann schon Java" nicht überbewerten.
wir sollten ne liste nen baum etc machen und ham das gemacht. Es hat funktioniert, wir warn fertig und konnten minigolf im internet spielen
Da war es vermutlich egal, was konkret in der Liste stand und wie man später sinnvoll damit arbeiten kann.
-
Oh böser böser Tipfehler.
Ich meinte natürlich: "Auch MIT Downcast" Oo. Also der Downcast hat nie probleme gemacht. Da stand ich wohl geistig ein wenig neben mir.
Ich werd mich mal ein wenig mit den Unterschieden auseinander setzen und mich immer tiefer reinarbeiten. Ich werds sowieso im Studium noch mal machen aber gerade versinke ich in Geistigem stillstand (Zivi fertig und jetzt nur noch 400 € Kraft für ein halbes Jahr).
In die Templates hab ich mich mal eingelesen gestern und es auch vom Prinzip her verstanden. Nur wirds schnell verwirrend mit dem Überladen und was dann geht und was nicht geht etc. da ist einfach ne große Informationsflut.
Ich denke mal man wird sowieso immer erst wirklich tief eindringen in eine bestimmte Themantik wenn man speziellere Anforderungen hat. Deshalb stell ich mir auch diese Aufgaben. Man lernt ganz anders, wenn man etwas erreichen will.
Grüße
MartinPs: gibt es einen besonderen Grund warum der GNU Compiler eine neue Zeile am Ende des Files erwartet? Ich mein is ja kein Problem die zu machen und es kommt ja auch nur ne Warnung aber hat mich gewundert.
-
Prinz Martin schrieb:
Ps: gibt es einen besonderen Grund warum der GNU Compiler eine neue Zeile am Ende des Files erwartet? Ich mein is ja kein Problem die zu machen und es kommt ja auch nur ne Warnung aber hat mich gewundert.
Ja, er erwartet es weil der Standard es so vorschreibt
(§16, der Präprozessor braucht ein newline als letztes Zeichen)