Plattform unabhängig?

  • Hallo,

    wie kann man Plattform unabhängig in c++ mit programmieren?

    bis jetzt habe ich nur erfahrung mit c in linux und windows (konsolen anwendungen)
    oder Windows Programme mit c++ (Borland 6 als Compiler)

  • Hallo,

    ich hab leider nicht soviel Erfahrung mit c++.

    Du darfst halt nichts nutzen, was Plattform-Spezifisch ist, wenn du plattform-unabhängig programmieren möchtest.
    Das schließt eigentlich GUI-Anwendungen mit ein. Ich weiß jetzt aber nicht wie es mit QT oder GTK aussieht.
    Richtig plattform-unabhängig ist es auch nicht, weil du es für jede Plattform kompilieren musst.

    Wenn du richtig plattform-unabhängig programmieren möchtest, solltest du Java verwenden.

    Gruß

    Sascha

  • Ist ja keine Sünde, wenn man für alle Plattformen separat kompiliert.
    Das Programmieren verläuft dennoch plattformunabhängig.
    Solange du nur die STL (Standard-Bibliothek) und die C-Standardbibliothek, also alles im namespace std, und den Sprachstandard (keine proprietären Spracherweiterungen, wie in VisualC++!) verwendest, läuft dein Programm auf allen Systemen.
    Möchtest du eine GUI verwenden, empfehle ich dir Qt. Es ist sehr einfach und auch mit nur grundlegenden Kenntnissen der Objektorientierung und der Qt-Bibliothek, kann man damit aufwändige graphische Oberflächen erstellen. Außerdem gibt es Möglichkeiten für Addons, Scripting, Netzwerkprogrammierung, Funktionsaufruf über strings zur Laufzeit und mehr. Ich finde es auch wesentlich intuitiver als Swing o. ä. in Java, das Hello-Wold Programm läuft eben auch mit sechs Zeilen relevantem Code - Moment, lass mich nachzählen:

    Code
    QApplication app(argc, argv);
    QMainWindow mw;
    QLabel text("Hello World!", &mw);
    mw.show();
    return app.exec();


    Okay doch nur 5.^^ Und man muss keine Riesengeschütze wie Vererbung einführen, nur damit ein Button etwas macht, wenn er geklickt wurde. Der Java-Bytecode ist natürlich praktisch für Applets u. ä. und durchaus oft sinnvoll, insgesamt halte ich jedoch C++ für eine umfangreichere, elegantere und schnellere Sprache.
    Wenn du noch irgendeine Bibliothek für plattformunabhängige Programmierung, Tutorials oder Programm suchst, schau mal hier. Wenn da auf einmal steht, dass VisualC++ benötigt wird, kannst du dir sicher sein, dass dein Programm nicht mehr anderswo laufen wird.

    Viele liebe Grüße
    The User

    PS: Ich sehe den Vorteil von Java weder in Garbage-Collection noch in dem Bytecode, die Java-Standardbibliothek allerdings hat vielseitigere Einsatzgebiete als STL - auch wenn ich STL für besser designt halte. Seit es jedoch Bibliotheken gibt, die hundertprozentige Plattformunabhängigkeit bieten, wie z. B. Qt, verfügt C++ über eben so mächtige Werkzeuge und darüber hinaus über Templates, Iteratorbereiche oder Operatorüberladung sowie Optimiermöglichkeiten.

  • Zitat

    insgesamt halte ich jedoch C++ für eine umfangreichere, elegantere und schnellere Sprache.



    Das ist ja Ansichtssache. :)
    Abgesehen vom letzten Teil. C++ und Java sind in den meisten Sachen gleich schnell. Es war tatsächlich mal so, dass Java langsam war, das ist aber schon lange nicht mehr der Fall. ;)

    Gruß

    Sascha

  • Die Schleife wird vielleicht gleich schnell ausgeführt, aber Garbage-Collection und die Auswertung des Bytecodes fordern schon ihren Tribut, gibt auch höhere Speicherverwendung. Aber klar, für viele Dinge finde ich Java auch sinnvoll, bloß die mangelnden Sprachfeatures, wie private Vererbung, Freunde, inline-Funktionen, Kopierkonstuktoren, Operatorüberladung und seltene implizite Konvertierung stören mich doch. Man sagt ich schreibe unleserlichen Code, aber das ist vorallem in Java durch die ganzen Klammern für die ständige Konvertierung und seltsame Methoden, die in C++ einen kurzen Operator hätten. ;)

  • Zitat

    Die Schleife wird vielleicht gleich schnell ausgeführt, aber Garbage-Collection und die Auswertung des Bytecodes fordern schon ihren Tribut, gibt auch höhere Speicherverwendung



    Wegen der Auswertung des Bytecodes wurde ja auch der JIT-Compiler(Just-In-Time) eingeführt.
    http://de.wikipedia.org/wiki/Just-in-time-Compilierung

    Dass Java manche Spracheigenschaften fehlen kann sein, aber ich hab bisher nichts vermisst.

    Was leserlichen Code angeht, naja, ich persönlich finde Java schon recht leserlich. :)
    Aber das ist alles Ansichtssache.

  • Ich bin eben mit C++ "aufgewachsen".
    Klar kann man mit Java alles machen, es ist Turing-vollständig^^ etc.
    Aber ich vermisse solche Sachen dann immer, ich denke mir: Das ginge so einfach mit privater Vererbung, stattdessen gibts jetzt schon wieder eine neue Klasse, war eben erst im Info-Unterricht so. (Lehrer: Welche Möglichkeiten gibt es denn dann die Methoden nicht verfügbar zu machen? Ich: Mit privater Vererbung, aber das gibt es nicht in Java.^^)
    Und mir gefällt es einfach wählen zu können: Dynamische Bindung, oder nicht; Objektorientierung, oder nicht; Templates, oder nicht, Speicherverwaltung, wie man will...

  • Naja, in Java kann man halt eine Exception werfen, wenn man nicht möchte, dass eine Methode ausgeführt wird. :)

    Ich hab ja nicht gesagt, dass C++ schlecht ist. :)
    Beide Sprachen haben ihre Daseins-Berechtigung.

    Ich wollte nur Anmerken, dass Java nicht mehr so langsam ist und dass Java durchaus auch für Anwendungen und nicht nur für Applets geeignet ist.

    Jetzt sollte man aber langsam Back to Topic. :)


    Gruß

    Sascha

  • Solange nicht noch .NET eine Daseinsbeechtigung bekommt.^^
    Es gibt so eine NotImplementedException, oder? Aber den throws-Zwang mag ich nicht.
    Gibt natürlich einen ganzen Haufen Möglichkeiten, die propagierte ist, eine Klasse nur mit geschützten Elementen zu erstellen und die anderen dann manche von denen freischalten zu lassen, aber das läuft eben alles auf endlos langweiligen Code hinaus, nur weil man drei Methoden nicht haben möchte. ;)

    @Theadmaker
    Nicht von unseren Flamewars abschrecken lassen, frag ruhig etwas, oder sag, was du so vorhast. ;)

  • Ich weiß gerade nicht wie die Exception heißt.
    Ok man muss in der Methode dann
    throw new XXXException() schreiben, aber meiner Erfahrung nach kommen solche Fälle selten vor, dass eine Methode nicht genutzt werden soll.
    Also sowas wie private Vererbung hätte ich bisher erst einmal gebraucht.

    Da man aber in Java gegen Interface programmieren soll, hat man solche Probleme ziemlich selten.

    Gruß

    Sascha

  • Die Variante gibts natürlich auch, Klasse privat machen und Zugriff nur übers Interface erlauben. Kam bei uns häufiger vor in Informatik, ein geordneter Baum darf keine manuellen Änderungen erfahren und ein Stack darf nicht die normalen Listenoperationen haben. ;)

  • Die Klassen sind bei uns nicht privat. Bei uns gibts zu fast allem Interfaces. Wir wissen nie, welche Konkrete Implementierung man im Moment nutzt. Dadurch sind die Anwendungen sehr dynamisch. Ganz grob gesagt, werden die Anwendungen mit XML-Dateien zusammengestöpselt.

  • Dann können die aus externen jars und so kommen?
    Gibts in C++ ja auch in der Art, zumindest wenn man Qt verwendet. Aber was meinst du genau mit XML gestöpselt, sowas wie bei KParts? Denke nicht, dass du das meinst.

    PS:
    Ist dann in C++ genauso, vorallem sinnvoll für Erweiterungen o. ä.: Deklarierst ein interface, das allerdings auch eine ganz normale Klasse sein kann, und die Module müssen das dann implementieren, damit man es richtig laden kann..

  • Aber sag mal, was das XML machen soll.
    Also was ich kenne ist KParts, da hat man eine XML-Beschreibung um Programme in andere Fenster einzubetten, wird toll bei KDE eingesetzt, z. B. im Konqueror oder auch KDevelop.

  • Eclipse beispielsweise hat eine kleinen Kern. Das ist das eigentliche eclipse. Alles andere sind Plugins.
    Dabei hat jedes Plugin eine Plugin.xml.
    In den XML-Dateien wird ganz grob gesagt, das Plugin beschrieben. Die Klassen werden dann dynamisch per Reflection nachgeladen.

    Man kann im laufenden Betrieb des Programms Plugins zuschalten und wieder abschalten.

    Gruß

    Sascha

  • Ist XML dafür auf jeden Fall notwendig?
    Ist das jetzt Eclipse-spezifisches XML, das Eclipse braucht, um den Kram zu laden, oder braucht man das immer in Java?

    Normalerweise gibt es ja in C++ nicht soetwas wie Reflection und Plugins, allerdings ist das über Qt alles möglich, einmal werden eben auf jedem System bestimmt Plugin-Mechanismen geladen und mit dem "Meta Object Compiler" werden z. B. solche Reflection-Infos erzeugt, aber auch das Aufrufen von Methoden über ihren Namen als String wird möglich.

  • Das XML ist eclipse-spezifisch.

    Reflection ist aber ein Bestandteil der Java-API.

    Das mit Plugins ist natürlich nicht Standard. Das ist eine Framework-Spezifikation.
    http://de.wikipedia.org/wiki/OSGi

    Dadurch lassen sich halt dynamische Anwendungen schreiben, die erweiterbar sind, ohne den alten Quellcode nochmal anpacken zu müssen.

    Gruß

    Sascha