Gibt es eine Möglichkeit die Main()Funktion zu verstecken


  • Administrator

    @Bulli,
    Es kann schon einen gewissen Sinn haben. Bei wxWidgets ist es insofern der Fall, weil noch jede Menge an Initialisierungen durchgeführt werden, welcher der Anwender der Bibliothek dann nicht selber schreiben muss. Man könnte es natürlich viel schöner über Templates machen, also sowas:

    template<typename AppT>
    int startup()
    {
      // Do something ...
    
      AppT* app = new AppT();
    
      // Initialise everything ...
    
      app->startup();
      delete app;
    
      return 0; // or something else.
    }
    
    // Und der Anwender schreibt nur noch:
    int main()
    {
      return startup<MyApp>();
    };
    

    Aber naja, wxWidgets wehrt sich ja seit Urzeiten gegen Templates und Namespaces und noch eine Menge anderer moderner Features. Auch die Version 3.0 soll ja überhaupt nicht moderner werden ... krank.

    Grüssli



  • Dravere schrieb:

    Man könnte es natürlich viel schöner über Templates machen

    Mir scheint, du bist ein richtiger Template-Freak. 🙂

    Dravere schrieb:

    Aber naja, wxWidgets wehrt sich ja seit Urzeiten gegen Templates und Namespaces und noch eine Menge anderer moderner Features. Auch die Version 3.0 soll ja überhaupt nicht moderner werden ... krank.

    Ich hab mir mal überlegt, wxWidgets zu lernen, aber das tönt ja nicht gerade überzeugend. Kann man trotzdem einigermassen damit programmieren oder läuft es auf einen ständigen Kampf hinaus? Was ist für GUI sonst noch zu empfehlen (wenn möglich plattformunabhängig)?



  • Du kannst die main-Funktion in einer Library verstecken. In einer Library etwa so:

    // app.h
    class Application
    {
        static Application* theApplication;
      public:
        Application()
          { theApplication = this; }
    
        virtual int main(int argc, char* argv[]) = 0;
        static Application* getApplication()  { return theApplication; }
    };
    
    // app.cpp
    Application* Application::theApplication = 0;
    
    int main(int argc, char* argv[])
    {
      Application::getApplication()->main(argc, argv);
    }
    

    Und hier dann deine abgeleitete Applikation:

    #include <app.h>
    
    class MyApplication : public Application
    {
      public:
        int main(int argc, char* argv[]);
    };
    
    MyApplication myApp;  // genau eine Applikationsinstanz
    
    int Application::main(int argc, char* argv[])
    {
      // hier ist jetzt dein Startpunkt
    }
    


  • Nexus schrieb:

    Ich hab mir mal überlegt, wxWidgets zu lernen, aber das tönt ja nicht gerade überzeugend. Kann man trotzdem einigermassen damit programmieren oder läuft es auf einen ständigen Kampf hinaus? Was ist für GUI sonst noch zu empfehlen (wenn möglich plattformunabhängig)?

    gtkmm scheint das einzige plattformunabhängige GUI-Framework überhaupt zu sein, dass modernes C++ verwendet.

    Gruß
    Don06


  • Administrator

    Nexus schrieb:

    Mir scheint, du bist ein richtiger Template-Freak. 🙂

    Templates sind ja auch toll, da kann man eine Menge Dinge mit machen ... eine Menge auch völlig unnötiger Dinge, aber trotzdem tolle Dinge 😃

    Nexus schrieb:

    Ich hab mir mal überlegt, wxWidgets zu lernen, aber das tönt ja nicht gerade überzeugend. Kann man trotzdem einigermassen damit programmieren oder läuft es auf einen ständigen Kampf hinaus? Was ist für GUI sonst noch zu empfehlen (wenn möglich plattformunabhängig)?

    Also grundsätzlich ist wxWidgets schon nicht schlecht. Man kann die Bibliothek wirklich benutzen, es hat vieles drin, zum Beispiel auch das Drucken, was viele nicht drin haben.
    Die Sache ist einfach die, dass wxWidgets 20 Jahre hinterher hinkt, was irgendwelche Erkenntnisse betrifft und es sieht nicht so aus, dass die aktuellen Entwickler jemals erleuchtet werden. So hat man immer noch überall Makros en masse und es ist halt eher ein sehr altes C++. Schon nur das man jegliches Widget per new anlegen muss und nicht auf dem Stack oder der Klasse reinsetzen darf, finde ich bescheuert. Aber sie mussten unbedingt für jegliches Widget einen Referenzzähler einführen. So leitet auch jegliches Widget von der wxObject Klasse ab. usw. usf.
    Dafür hat man eine grosse Community, guter Support, sehr gute Dokumentation und gute Zusatztools (z.B. GUI-Designer). Es ist halt einfach nur uraltes C++ ... sobald man diesen Ekel überwunden hat, ist die Bibliothek wirklich gut 🙂

    @Don06,
    Das Problem von gtkmm ist, abgesehen von den massenweise DLLs, dass es keine native Widgets unterstützt.

    Grüssli



  • socco schrieb:

    kein Danke für die weder hilfreichen noch sich auf meine Frage beziehenden Antworten. 👎

    Nexus schrieb:

    Ach, mach doch, was du willst. Wenn du die Antworten als nicht hilfreich bezeichnest und stur bei deiner Lösung bleiben willst, dann tu doch das. Mir (und auch den anderen Leuten hier) ist das ehrlich gesagt ziemlich egal.

    Trotzdem ist es nicht gerade die nette Art, die Bemühungen anderer Leute zu schätzen. Naja... 🙄👎

    Genau darauf wollte ich auch hinaus mit meinem nicht nettem Komentar.
    Ich danke natürlich allen Leuten die mir versucht haben zu zeigen wie ich es machen sollte.
    Ich rege mich nur so auf weil ich hier eigentlich nur mitlese und versuche nicht mit Anfängerfragen zu nerven, (habe vielleicht in den 2 Jahren nur 4 Fragen gestellt) indem ich alte Posts durchsuche. Leider ist es fast immer das gleiche das erstmal ein Dutzend Leute antstatt einfach auf die Frage zu antworten oder wenn sie es nicht können, den Thread einfach zumachen und vergessen, erstmal ihren Senf (der in keinem Fall irgendwie die Frage beantwortet) dazugeben müssen. Ich habe einfach etwas überreagiert.
    Jetzt aber genug Tränen vergossen - back to Topic...
    tntnet hat genau den Ansatz aus dem Buch angezeigt.
    Es geht darum (im Buch) ein allgemeines Framework zu erstellen.



  • Wie gesagt, ich habe lediglich deinen Ansatz hinterfragt, weil er für mich so in C++ keinen Sinn macht. Dies tat ich, um möglicherweise eine Alternative vorschlagen zu können.

    Aber wenn du das nicht verstehen kannst und meine Bemühungen als sinnlos und irrelevant darstellst, kann ich dir auch nicht helfen. Sei doch bitte das nächste Mal wenigstens so nett und sag von Anfang an, dass du deine Lösung stur durchsetzen willst und keinen Wert auf die Diskussion über deren Sinn legst.



  • #define ENTRYPOINT X
    

    unsauber aber gut



  • Listing, ist das auch portabel?



  • Sollte es sein :p

    Warum denn nicht?



  • Sorry, ich dachte, das wäre irgendein Makro auf Compilerebene.

    Wie willst du das denn komfortabel in ein Programm einbauen, sodass es etwas bewirkt?



  • Nexus schrieb:

    Wie willst du das denn komfortabel in ein Programm einbauen, sodass es etwas bewirkt?

    So wie es Dravere auf Seite 2 gezeigt hat.

    Nexus schrieb:

    @ Bulli:
    Antworte ihm nicht, es ist sowieso nur nutzlos. Er hat ja seine "Lösung".

    boah... Gott (wieder) in Aktion...

    cheers, Swordfish



  • Swordfish schrieb:

    boah... Gott (wieder) in Aktion...

    Schau vielleicht zuerst mal, wie er auf die Threads (ausser der, der ihm geholfen hat) reagiert hat, bevor du mit dummen Sprüchen kommst.


Anmelden zum Antworten