meine erste GUI...
-
Ich wollte mit C++ anfangen und suche jetzt nach einem geeigneten Einstieg!
Ich hab mir auch schon zwei Bücher gekauft und sie durchgekaut.
Dann ein bisschen ausprobiert wie man Objekte erstellt und sie benutzt, alles mit simplen und sinnlosen Konsolen-Programmen!
Genauso könnte ich jetzt auch den Umgang mit GUI-Anwendungen lernen, aber da das dann doch etwas mehr Arbeit ist, dachte ich mir ich mach gleich irgendwas sinnvolles...
Das Problem ist mir fällt einfach nix ein!!!
Erschwerend kommt noch hinzu, dass ich bereits Java gelernt hab und so die meisten sinnvollen Sachen viel einfacher in Java realisieren kann.
Mein Eifer das dann mit dem 20fachen Zeitaufwand in C++ zu machen hält sich somit in Grenzen!
Aber vielleicht gibt es ja irgendwas, dass irgendwie C++ speziell ist...Ich weiß das dass sehr spezielle Wünsche sind, aber ich wär euch wirklich Dankbar
-
JJK3 schrieb:
Das Problem ist mir fällt einfach nix ein!!!
Das Problem haben wohl 99% von uns hier :p
Zu Lernzwecken kannst du ja Standardanwendungen schreiben, wie der Taschenrechner, ein Bildbearbeitungsprogramm oder ein Spiel wie Minesweeper.
Diese kannst du dann erweitern, um sie interessanter zu gestalten.JJK3 schrieb:
...ich bereits Java gelernt hab und so die meisten sinnvollen Sachen viel einfacher in Java realisieren kann.
Mein Eifer das dann mit dem 20fachen Zeitaufwand in C++ zu machen hält sich somit in Grenzen!Wenn du Java gut kannst, ist der Hauptgrund für C++ doch wohl die Geschwindigkeit der Anwendungen. C++ ist nun nicht die 20fache Arbeit, aber wenn du nach 2 Bücher bereits jetzt so ein schlechtes Urteil hast, warum es dann lernen?
Lies dir einfach mal ein paar Vergleiche zwischen Java und C++ durch, um ein klareres Bild zu bekommen, wie z.B. hier.
-
Danke dein Link hat mich schonmal weitergebracht obwohl mir das meiste selbst schon klar geworden war.
Ich hab ja im Allgemeinen kein schlechtes Bild von C++, aber ich mag java von der Syntax und den Bereitgestellten Bibliotheken einfach lieber...
Ich emfinde in der Syntax einfach die header Dateien als so unglaublich Sinnlos!
Ich meine wieso macht man es nicht einfach wie bei java:
Überall davor schreiben ob es private oder public oder ...
Dass ist vielleicht nicht ganz so übersichtlich, aber viel einfacher und man sparrt sich eine Datei!?
Außerdem leuchtet mir der Sinn des de-Konstruktors nicht ein!
Ich mein die Variablen verschwinden am Ende ihres Gültigkeitsbereiches doch sowieso, oder nicht? Und wenn nicht worauf soll ich meinen Zeiger(den ich übrigens auch nicht mag) denn im De-Konstruktor setzen?
Vielleicht kannst du mir diese Fragen (bzw. als Frage gemeinte Aussagen ;)) ja beantworten, das würde meine Lust an C++ merklich steigern :D.
Warum trotzdem C++ lernen?
Naja, ich interessiere mich für Systemnahe-Programmierung und dafür ist Java ja leider völlig Ungeeignetheit!
Vielleicht hast du ja ein Systemnahes Lernprogramm, dass in Java praktisch nicht zu realisieren ist?Danke
-
Vielleicht wird dir C# mit .NET und den beiden GUIs WindowsForm und WPF besser gefallen. Mögliches Einstiegsbuch: http://www.c-plusplus.net/forum/313049
Hier liegt nahezu alles auf GUI-Anwendungen mit vielen Beispielen zum Üben.Ansonsten zuviele Fragen auf einmal. Zu Destruktoren: oft nicht erforderlich, aber sinnvoll wenn man selbst Ressources angefordert hat und diese nicht mehr benötigt.
-
Ne, danke an C# bin ich nicht so interessiert, aber danke!
Wieso zu viele Fragen sind doch nur noch zwei:1. Wofür header Dateien? Geht es vlt. auch ohne?
2. Vielleicht hast du ja ein Systemnahes Lernprogramm, dass in Java praktisch nicht zu realisieren ist?
Kann mir nochmal jemand helfen?
-
JJK3 schrieb:
1. Wofür header Dateien? Geht es vlt. auch ohne?
Alles was Du verwendest, muss in der jeweiligen CPP-Datei vorher deklariert worden sein. Durch das Einbinden der Header-Files mit den ganzen Deklarationen darin, erreicht man das eben.
Aber ja: Das Dateischema von C++ ist ein totaler haufen Müll. Deswegen schreit ja auch jeder nach einem vernünftigen Modulsystem, aber das Standardkomitee kommt ja selten in die Gänge.
-
asdqweyxc schrieb:
Aber ja: Das Dateischema von C++ ist ein totaler haufen Müll. Deswegen schreit ja auch jeder nach einem vernünftigen Modulsystem, aber das Standardkomitee kommt ja selten in die Gänge.
Bin ich also nicht der einzige der da Scheiße findet?
Wieso macht man das denn nicht in eine? Also in der header Datei auch gleich den Code (ich meine die Aktionen der methode)?
Woeso zwei? Das ergibt doch eigentlich keinen Sinn, oder?
-
JJK3 schrieb:
Bin ich also nicht der einzige der da Scheiße findet?
Ganz im Gegenteil.
JJK3 schrieb:
Wieso macht man das denn nicht in eine? Also in der header Datei auch gleich den Code (ich meine die Aktionen der methode)?
Woeso zwei? Das ergibt doch eigentlich keinen Sinn, oder?Ein #include ist eine reine Textersetzung. Alles was in der Headerdatei steht, wird an die Stelle des Includes kopiert. Mit dieser Vorgehensweise käme man nicht weit, wenn es nur noch einen Dateityp geben würde. Beispiel: Zwei sich gegenseitig inkludierende Dateien.
Ein echtes Modulsystem zaubert ein bisschen im Hintergrund, dazu hat es C++ aber in 30 Jahren noch nicht geschafft
-
Ich hatte mal eine Aufgabe, da ging es um DNA-Sequenzierung, was das schnelle Schreiben von Daten auf die Festplatte erforderte. Erstes Problem: Man kann in Java kein Array von Objekten anlegen. Wenn man es versucht kriegt man ein Array von Pointern die man alle einzeln mit new füllen muss. Dann sollte dieses Array auf die Festplatte. Aus C kenne ich fwrite, das packt einen Block Speicher auf die Festplatte. In Java musste man jedes Objekt einzeln auf die Platte schreiben. Buffered_writer oder so ähnlich hat da auch nicht mehr geholfen. Das einzige Äquivalent zu fwrite in Java hat ein Byte[] genommen. Naja, caste ich doch mal mein int[] in ein byte[] um. Geht nicht. Ok ich nehme Bytes und shifte das hin und her und baue mir daraus Integer. Das ging auch nicht, weil ein Array nicht mehr als 2 Millionen Elemente haben kann und ich mehr als 2GB brauchte. Gut, macht man es halt 2-Dimensional, dann hat man 2 Indizes die man aus einem long extrahieren kann aber nein, dann muss man wieder jedes Array in dem ersten Array von Hand anlegen. Und hintereinander im Speicher liegt es auch nicht.
Es ging damals um eine Art n*m-Matrix, bei der man nicht alle Stellen brauchte, aber vorher nicht so genau wusste welche. Das Ziel war es unter O(n*m) zu kommen. Das scheitert in Java schon daran, dass man die Matrix gar nicht deklarieren kann, ohne dass die JVM los rennt und überall Nullen rein schreibt, sodass das Ziel von vornherein nicht erreichbar ist.
Es gibt kein unsigned, weshalb man bei Netzwerkprotokollen und allgemein Protokollen mit unsigned verloren hat oder zumindest inperformant ist.Das war meine letzte Erfahrung mit Java, seit dem habe ich Java gemieden. Ich hatte nur gegen die Sprache gekämpft anstatt das Problem zu bearbeiten. Die Sprache war für das Vorhaben einfach völlig ungeeignet, vielleicht motiviert dich das was Ähnliches zu versuchen und stellst dann fest, wie viel mächtiger C/C++ ist.
In letzter Zeit hatte ich mir allerdings überlegt Java nochmal eine Chance zu geben, da C++ das Problem hat, dass es zu viele Möglichkeiten und Design-Pattern gibt, was ein Zusammenarbeiten schwer macht. Das Problem hat Java nicht und ist daher für Projekte mit mehr als einem Entwickler vielleicht besser geeignet.
PS: Destruktoren sind nicht dafür da, dass das Objekt zerstört wird. Das kann der Compiler alleine. Ziel ist, dass das, was an dem Objekt noch dran hängt, aber nicht zum Objekt gehört auch freigegeben wird.
Zum Beispiel ein Dateiobjekt, was im Konstruktor eine Datei öffnet und im Destruktor schließt. Den Speicher für das Objekt freigeben geht automatisch (im Sinne von automatischer Destruktor, nicht Garbage Collection), aber dass vorher eine Datei geschlossen werden muss, das kann der Compiler nicht wissen. Ähnlich sieht es mit Objekten aus, die sich selbstständig in Listen ein- und austragen oder Referenzzählern.
-
JJK3 schrieb:
...ich mag java von der Syntax und den Bereitgestellten Bibliotheken einfach lieber...
Syntax ist ja Geschmackssache, aber was die Entwicklung von Bibliotheken betrifft, habe ich gelernt, dass neue Techniken meist zuerst in C/C++ implementiert werden. Meiner Meinung nach ein gutes Argument für C++.
JJK3 schrieb:
Ich emfinde in der Syntax einfach die header Dateien als so unglaublich Sinnlos!
Ich meine wieso macht man es nicht einfach wie bei java:
Überall davor schreiben ob es private oder public oder ...
Dass ist vielleicht nicht ganz so übersichtlich, aber viel einfacher und man sparrt sich eine Datei!?Header verhindern das Aufblähen von Quellcode-Dateien und machen somit die Dokumentation übersichtlicher.
Ebenso kann der Linker mit dieser Struktur schneller arbeiten, was bei großen Projekten eine Menge Kompilierzeit spart.
Somit haben auch Header ihre Vorteile und können in Sympathie-Diskussionen enden.JJK3 schrieb:
Außerdem leuchtet mir der Sinn des de-Konstruktors nicht ein!
Ich mein die Variablen verschwinden am Ende ihres Gültigkeitsbereiches doch sowieso, oder nicht?In C++ wird öfters dynamischer Speicher verwendet, welcher eben nicht wie in Java befreit wird, wenn kein Verweis mehr darauf besteht - es liegt in der Verantwortung des Programmierers selbst.
Dieser Speicher kann im Konstruktor reserviert und im Destruktor befreit werden. In Java kümmert sich ein sog. Garbage Collector (dt. Müllsammler) um die automatische Speicherbefreiung, welcher allerdings wegen seiner ständigen Aktivität das Programm verlangsamt.
Der Destruktor hat also seinen Sinn im Geschwindigkeitsvorteil von C++, aber kann auch für andere Aufgaben verwendet werden, wenn ein Objekt 'zerstört' wird.JJK3 schrieb:
Naja, ich interessiere mich für Systemnahe-Programmierung und dafür ist Java ja leider völlig Ungeeignetheit!
Vielleicht hast du ja ein Systemnahes Lernprogramm, dass in Java praktisch nicht zu realisieren ist?Schon den Wikipedia Artikel dazu gelesen?
Grob zusammenfassend: "Mehr Herstellungs-Arbeit für mehr Anwendungs-Performance."
Bei Anwendungen, die extrem stark auf Performance setzen, wie Spiele und Renderer, ist es vorteilhafter, Maschinencode von der Maschine ausführen zu lassen, anstatt Bytecode von einem Interpreter, welcher selbst von der Maschine ausgeführt wird.
-
Hm, ok so wie ich das verstanden habe ist es theoretisch möglich das Programm auch ohne header Dateien zu schreiben!?
z.B. Wenn man in die .ccp einfach das hier schreibt:class Blabla { public: Blabla() { cout << "Blabla"; } };
Und der Dekonstruktor ist Praktisch nur ein spezieller Listener
-
Destruktor!
Nein, nur Header geht, aber dann brauchste mindestens eine cpp.
Außerdem ist das dann unflexibel, weil alles neu kompiliert werden muss, wenn eine Klasse geändert wird.Edit: Destruktoren sind übrigens ein sehr sinnvolles und mächtiges Feature, auf jeden Fall besser als GC.
-
Nathan schrieb:
Nein, nur Header geht, aber dann brauchste mindestens eine cpp.
Ja, die main cpp, oder?
Nathan schrieb:
Edit: Destruktoren sind übrigens ein sehr sinnvolles und mächtiges Feature, auf jeden Fall besser als GC.
Mag sein nur so ganz verstanden was rein muss hab ich nicht? Hast du da ein Beispiel?
Und zu meiner Ursprungsfage:
Hat jemand eine Idee zu irgendeinem sinnvollen Programm das man in java gar nicht machen kann?Danke nochmal für eure Hilfe!
-
@JJK3
Ein Destruktor zerstört das Objekt. Es muss also alles rein was nötig ist, damit vom Objekt kontrollierte Resourcen wieder freigegeben werden.
Bzw. bei diversen Hilfsklassen: alles was nötig ist um die vom Konstruktor gemachten Änderungen wieder rückgängig zu machen.Ein Destruktor einer File-Klasse wird z.B. das File-Handle zumachen.
Ein Destruktor einer Array-Klasse wird das Array freigeben.
Ein Destruktor einer Tree-Node Klasse wird alle Child-Nodes freigeben (was wiederrum zum Aufruf des Destruktors der Child-Nodes führt).
Ein Destruktor einer UniqueLock Klasse wird das "unlock" machen, welches das Gegenstück zum "lock" ist das im Konstruktor erfolgt ist.
Ein Destruktor einer Transaktions-Klasse wird die Transaktion zurückrollen (sofern sie nicht davor schon committed wurde).
Uswusf.JJK3 schrieb:
Und der Dekonstruktor ist Praktisch nur ein spezieller Listener
Ein Destruktor ist kein Listener. Keine Ahnung wie du darauf kommst.
-
C/C++-Programme in Header und (wie heißt das andere?) aufzuteilen ist nur Konvention. Du kannst selbstverständlich alles in eine .cpp schreiben. Du kannst auch alles in eine .h schreiben. Du kannst auch alles in eine .jpg schreiben. Dem Compiler ist das wurscht. Der weiß sowieso nicht, dass es sowas wie Header-Dateien gibt, weil die üblicherweise vorher eingesetzt werden. Dass du eine .cpp brauchst oder gar eine main.cpp ist Quatsch.
Zur anderen Frage: In dem Link von Youka stand was drin.
Folgende Funktion ist in Java nicht möglich:void swap(int &i1, int &i2){ //tausche i1 und i2 int temp = i1; i1 = i2; i2 = temp; }
Kann man zwar in Java so ähnlich hinschreiben, tauscht aber die Werte nicht.
Weiterhin kannst du keinen Bootloader schreiben, aber das geht in C++ auch nicht, dafür braucht man 512 Byte Assembler. Aber wenn man die hat kann man leicht zu C wechseln. Zu Java definitiv nicht. Eine Adresse ist für den Videospeicher, damit man Text auf dem Bildschirm ausgeben kann. In Java kann man "Schreibe mal "Hallo" an Adresse 0x800" nicht ausdrücken.
Oder wie wärs mit "Gebe die Bit-Repräsentation von double 3.14 aus". Vielleicht findest du ja in Java eine double to bit-Array-Funktion, ansonsten ists Pech. Selber schreiben geht nicht.
Außerdem kannst du nichts programmieren, wofür es keine JVM gibt, was für viele Mikrocontroller zutrifft. Selbiges trifft natürlich für C++ zu, wo es einen Compiler für die Plattform geben muss, allerdings ist ein C-Compiler sehr viel einfacher zu bauen als eine JVM.
Vielleicht solltest du dir mal https://de.wikipedia.org/wiki/Turingmächtig ansehen, was effektiv sagt, dass C++ und Java dieselben Funktionen berechnen können, allerdings ist die Definition für Funktion sehr weit gefasst.
Anders ausgedrückt: Du könntest in Java einen C++-Interpreter schreiben. Dann kannst du auch die oben genannte Swap-Funktion bauen. Sie ist zwar in C++ geschrieben, läuft aber in Java.Mir fällt aber noch etwas ein, was in Java nicht geht:
Alloziere Speicher und sieh nach was da so drin steht. Ich habe es schon erlebt, dass jemand Firefox zugemacht hat, per malloc Speicher angefordert hat, diesen als Text ausgegeben hat und dann dort seine Passwörter gesehen hat.
Java macht dir das kaputt, weil es einfach die schönen Passwörter mit Nullen überschreibt.
-
nwp3 schrieb:
Weiterhin kannst du keinen Bootloader schreiben, aber das geht in C++ auch nicht, dafür braucht man 512 Byte Assembler. Aber wenn man die hat kann man leicht zu C wechseln. Zu Java definitiv nicht. Eine Adresse ist für den Videospeicher, damit man Text auf dem Bildschirm ausgeben kann. In Java kann man "Schreibe mal "Hallo" an Adresse 0x800" nicht ausdrücken.
Und nach ein paar bzw. paar hundert weiteren Zeilen C kannst du dann zu Java wechseln. Indem du alle für Hardware-Zugriffe nötigen Funktionen in C implementierst irgendwie in die JVM reinschummelst.
JVM Implementierungen gibt es auch einige, die sollten auch relativ gut protierbar sein wenn man Anfangs mal auf Dinge wie JIT verzichtet.Ich will jetzt nicht sagen dass ich es für eine gute Idee halte, aber grundsätzlich sehe ich jetzt kein absolutes KO Kriterium dafür ein OS zu 95% in Java zu schreiben.
-
hustbaer schrieb:
JJK3 schrieb:
Und der Dekonstruktor ist Praktisch nur ein spezieller Listener
Ein Destruktor ist kein Listener. Keine Ahnung wie du darauf kommst.
Naja es wird wie bei einem Listener eine Funktion bei einem bestimmten Ereignis aufgerufen...
Ich weiß das dass jetzt eigentlich schon nix mehr mit meiner ursprungsfrage zu tun hat, aber das ist ja eigentlich auch egal...
Wie alloziert man den Speicher und gibt ihn aus?
Edit:
Mir fällt gerade auf es mir das wenig bringen würde wenn ihr mir jetzt die Antwort geben würdet
Wo lernt man den Praxisorientiert wie man das Betriebssystem ohne viele Umwege Dinge fragt(z.B. einen USB-Port fragen was da los ist, ob und welche Daten transferiert werden... usw.)
-
????????
????????
????????
????????
????????
????????
????????
-
???
-
Wenn du jetzt spammst und quengelst wie ein kleines Kind wird keiner Lust haben dir zu helfen.
Ich auch nicht, deswegen gebe ich dir nur diesen Tipp.
-
Uääääähhhhh!
Ne, mal ernsthaft, weiß es jemand?
Wenn ich einfach still bin und warte sieht das hier niemand mehr und die Frage ob mir jemand helfen will oder nicht, hat sich komplett erledigt!P.S. wenn du mir helfen kannst, dann tue das doch bitte