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



  • Geht das überhaupt ? Man brauch doch einen "Einstiegspunkt" und dazu dient die main.



  • MFC benutzen. 😉



  • da habe ich auch immer gedacht, aber ich bin mir ziemlich sicher das die Klasse
    dies machen sollte.
    Ich habe damals den ansatz auch garnicht nachvollziehen können.
    Werde wohl das Buch suchen müssen.



  • An deiner Stelle würde ich das gar nicht weiter verfolgen, da schon die Überlegung irgendwie sinnlos ist. Da gibt es interessantere Aspekte von C++, die es zu lernen gilt. 🙂



  • socco, du hast doch bestimmt eine vage Absicht hinter dem Verstecken der main() -Funktion. Was willst du erreichen? Gut möglich, dass das besser geht.



  • nichts gegen C++ oder sonst irgendwelche Sprachen oder Entwickler oder Benutzer
    aber ich finde es wäre viel eleganter wenn diese funktion einer bestimmten Klasse zugeordnet werden könnte.
    Ich habe auch schon eine Idee wo ich das gelesen haben könnte...
    gleich muss mal kurz suchen.



  • So... wer suchet der findet.
    Das ist aus dem Buch Focus on SDL (Primer Press).
    Hier mal ein Zitat:
    The entire goal of CApplication is to eliminate
    the need to write a main function. (There will still be a main function,
    of course, but it will be hidden in the implementation of CApplication.)
    Ich habe das jetzt kurz überflogen- ich glaube nicht das ich es verstehe.



  • Ist es denn so schlimm für dich, die main() -Funktion nicht "verstecken" zu können?



  • nein, alles nicht schlimm - aber es wäre auch nicht schlimm wenn ich es könnte
    deswegen frage ich.
    Leider geht der Autor nicht näher darauf ein, muss mir den code anschauen.



  • Also doch schlimm. :p

    Naja, du musst wissen, ob sich der Zeitaufwand für etwas lohnt, das nicht Standard-C++ ist und möglicherweise überhaupt nicht funktioniert. Vor allem weil der einzige Grund darin besteht, eine Anpassung an C++ zu vermeiden.



  • socco schrieb:

    The entire goal of CApplication is to eliminate
    the need to write a main function. (There will still be a main function,
    of course, but it will be hidden in the implementation of CApplication.

    du weist schon was das heist oder?

    du sollst eifnach nur nicht merh die main schreiben
    bzw einmal am anfang oder so

    das sieht dann so ungefähr aus:

    // main.cpp
    int main()
    {
       Go test;
       test.start();
       return 0;
    }
    
    // Prog1.cpp
    #include <main.cpp>
    
    class Go
    {
        void test()
        {
            // dein quellcode
        }
    }
    

    also ungefähr sowas wie die Java IDE BlueJ macht...
    aber wirklich toll ist das nicht



  • man kann nicht include .cpp schreiben. Und überhaupt verstehe ich nicht was du da vorhast. Inzwischen habe ich es nachvollziehen können wie der Autor des Buches es gemacht hat. Es ist intelligent gelöst und hat garnichts mit "non Standart C++ zutun.
    Danke für die nützlichen Infos. 👍
    kein Danke für die weder hilfreichen noch sich auf meine Frage beziehenden Antworten. 👎



  • socco schrieb:

    man kann nicht include .cpp schreiben.

    Natürlich kann man das.



  • socco schrieb:

    man kann nicht include .cpp schreiben.

    Was denkst du denn was include tut? 😉



  • socco schrieb:

    man kann nicht include .cpp schreiben. Und überhaupt verstehe ich nicht was du da vorhast. Inzwischen habe ich es nachvollziehen können wie der Autor des Buches es gemacht hat. Es ist intelligent gelöst und hat garnichts mit "non stan**** C++ zutun.
    Danke für die nützlichen Infos. 👍
    kein Danke für die weder hilfreichen noch sich auf meine Frage beziehenden Antworten. 👎

    Wenn du schon hier so eine Welle machst, solltest du wenigstens darauf achten, selbst keinen Blödsinn zu schreiben. Man kann im Grunde jede Datei per #include einbinden, ob das sinnvoll ist oder nicht. Du kannst auch sowas hier notieren:

    #include "SoccoIstSchonEinGrosserJunge.txt";
    

    Gar kein Problem. Und es gibt durchaus SDKs, in denen .c- oder .cpp-Dateien inkludiert werden, nur so am Rande...

    Mit deinen Worten:

    Danke für das Schmunzeln, das du mir beschert hast. 👍
    Kein Danke für die Falsch-Infos, die du gepostet hast. 👎

    P.S.: "Standard" schreibt man nicht mit "t" am Ende... 🙄


  • Administrator

    Es steht übrigens gar nirgends wie es geht, falls es also jemand wissen möchte, wahrscheinlich ist sowas gemeint:

    // App.hpp
    
    class App
    {
    public:
      App() { };
      virtual ~App() { };
    
    public:
      virtual startup() = 0;
    };
    
    #define IMPLEMENT_APP(AppClass)  \
                                     \
    int main()                       \
    {                                \
      App* app = new AppClass();     \
      app->startup();                \
      delete app;                    \
                                     \
      return 0;                      \
    }
    
    // Verwendung:
    
    // MyApp.hpp
    
    #include "App.hpp"
    
    class MyApp : public App
    {
      // Alles implementieren.
    };
    
    // MyApp.cpp
    
    #include "MyApp.hpp"
    
    IMPLEMENT_APP(MyApp);
    

    Wird zum Beispiel bei wxWidgets so angewandt. Find ich persönlich aber äusserst hässlich.

    Grüssli



  • Das "Verstecken" von main() macht doch heute null Sinn. Damals hat die SDL die main() versteckt, damit man einen standard-Einstieg unter Win32 und z.B. Linux hat. Weil Win32 damals noch WinMain() gebraucht hat, um eine Fenster-Anwendung zu starten. Wenn man also SDL als "platformneutral" verkaufen wollte, ist das ein wenig peinlich sagen zu müssen, das man für zwei Plattformen doch zwei verschiedene Einstiegstpunkte braucht. Also wurde main() und WinMain() von SDL implementiert, und beide haben die "offizielle" SDL-Einstiegsfunktion aufgerufen. Und alles wurde gut.

    Das gleiche gilt für wxWidgets und was es da sonst noch alles gibt.

    Aber heute ist das doch total unsinnig main() zu verstecken, weil man seit Windows 2000 Professional auch eine Fenster-Anwendung OHNE WinMain() schreiben kann. D.h. sowohl unter Win32 als auch Linux kann es ein und den selben Einstiegspunkt geben: main() !



  • socco schrieb:

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

    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... 🙄

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


  • 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)?


Anmelden zum Antworten