C++ Main-Funktion in Klasse auslagern

  • C++

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    C++ Main-Funktion in Klasse auslagern

    Servus.

    Ich habe mich mal wieder seit längerer Zeit ein bissle mit C++ beschäftigt und mir ist dabei etwas aufgefallen, was mich stört: Kann man die Main-Funktion direkt in eine Klasse auslagern, ohne dass man sie wie in C einfach so inner Datei drin hat?

    D.h. statt dem:

    C-Quellcode

    1. // Vorausgesetzt, wir haben ne Cpp-Datei in der der Code für unsere Methode steht
    2. class abc
    3. {
    4. public:
    5. int main(int, char **);
    6. abc();
    7. ~abc();
    8. }
    9. int main(int argc, char **argv)
    10. {
    11. abc *bc = new abc();
    12. return main(argc, argv);
    13. }
    Einfach das hier:

    C-Quellcode

    1. class abc
    2. {
    3. int main(int argc, char **argv)
    4. {
    5. // Programmcode einfügen
    6. }
    7. }


    Würde mich freuen, wenn mir jmd helfen kann ^^

    LG :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ichduersie“ ()

    Nach C++-Standard: nein.

    Aber du kannst deinen Compiler/Linker ggf. überreden, einen anderen entry point zu nutzen. Bei VS gibt es z.B. die Option /ENTRY und gcc/ld bietet den Parameter -e. Ob "Foo::main" unterstützt wird, ist Abhängig von der Implementation.
    (Logischerweise sollte die Methode dann aber static sein.)

    Kompatibilität zum Standard sollte wichtiger sein als das persönliche Wohlbefinden, daher solltest du wenn wie angedeutet vorgehen:

    C-Quellcode

    1. class Foo {
    2. public:
    3. static int main(int argc, char *argv[]);
    4. // ...
    5. };
    6. int main(int argc, char *argv[]) {
    7. return Foo::main(argc, argv);
    8. }
    Ich versteh nicht ganz, was daran störend ist, aus nativer Sicht gibt es durchaus Sinn die main funktion nicht aus einer Klasse aufzurufen.
    Aber wie über mir schon angedeutet kannst du eine Funktion einer Klase aufrufen, nur stellt sich mir da wieder die Frage nach dem Sinn.

    Abstraktionsmäßig ist es doch schöner, wenn die Klasse nicht static ist, du diese in der Main-Methode initialisierst und die Parameter zumindest in einem vorgeparstem Format übergibst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    dann hast du irgendetwas falsch gemacht, es geht.

    Außderm gibt es in C++ nichtmal statische Klassen, also kannst du bei C#/C++ genau dasselbe machen, bis auf den einen call, der halt nunmal eine einfache scope-less funktion ist, aufrufbar mit einem einfachen ASM call.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Naja wie VS das kompiliert ist so'ne Frage. Das Beispiel funktioniert mit VC++ nicht. Normalerweise wird die Funktion dann als Foo::main() exportiert (undekoriert), dann müsste man dem Linker den dekorierten Namen geben und es kompiliert.

    Edit:
    Ok geht nicht. Erfolgreich kompillieren und linken geht zwar, das System findet den Einstiegspunkt aber nicht mehr ^^ Die Funktion sieht dann so in der PE aus ?main@program@@CAHHQEAPEA_W@Z gewollt ist aber main. Machs also am Besten nach Standard und füg ne entry.cpp nur mit dem Einstiegspunkt hinzu.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()