main() "weglassen"
-
Ich muss mich leider korrigieren:
Mein C++ für Windows ist etwas älter (C++ 3.1 oder so),
ich hab ja auch noch openSUSE 10.2 und da ist ja auch C++ dabei
(MIT namespace
).Hab den Code mit #pragma probiert, ich kann mir zwar denken was der
pragma-Befehl an dieser Stelle macht, aber nachvollziehen kann ich's nicht.
Hab ihn unter Linux ausprobiert und es funktioniert nicht, er will immer noch ein Main() haben.Einsichtig: Das mit dem "umdefinieren" des namespaces ist nicht wirklich gut,
hab auch gestern 'ne neue Methode probiert.Gibt es zufällig die Möglichkeit, einen Zeiger auf eine beliebige Funktion zu definieren und diesen dann als Funktion zu nutzen, also so nach dem Motto...
Typ Funktion() { ... } ... Typ Zeiger = Funktion(); // oder: Typ Zeiger = *Funktion() ? // oder: Typ Zeiger = &Funktion() ? // oder, oder, oder, ... ... Zeiger(); //hier wird eigentlich Funktion() aufgerufenMit Zeigern hab ich's nämlich meist nicht so, bin bisher meistens ohne
ausgekommen, wenn's aber sein muss, oder besser ist, nehm' ich natürlich
welche.
-
Danke natürlich für eure Hilfe. Ich will ja nicht unhöflich sein.
Wenn jemand sich auskennt, nehm ich Ratschläge gern an, besonders weil ich
gern programmiere (leider eben ned so professionell).
-
Ja Funktionszeiger gibts:
#include <iostream> void foo() { std::cout << "calling foo()" << std::endl; } typedef void ( *fun_ptr )(); int main() { fun_ptr ptr = foo; ptr(); }
-
Danke, vielmals.
Ich habe jetzt übrigens noch 'ne tolle Möglichkeit, das main() "wegzulassen" entdeckt. Hier einfach mal der Code zum durchlesen:"Classes.h"
#ifndef __CLASSES_H #define __CLASSES_H namespace Classes { typedef void TForm; class Application { static int nInstance; typedef void (*TForm)(); public: Application(); Application(TForm Pointer); TForm Run; int hInstance(); ~Application(); }; } int Classes::Application::nInstance = -1; Classes::Application::Application() { ++nInstance; } Classes::Application::Application(TForm Pointer) { ++nInstance; Run = Pointer; } int Classes::Application::hInstance() { return nInstance; } Classes::Application::~Application() { Run(); --nInstance; } int main() { return 0; } #endif"Form1.h":
#include <iostream> using namespace std; namespace Form1 { class TForm1 { public: static void Main() { cout << "Geht." << endl; } }; }"Form1.cpp"
#include <iostream> #include "Classes.h" #include "Form1.h" namespace Form1 { Classes::Application Form1(TForm1::Main); }Man schreibt also sozusagen eine Headerdatei mit den eigentlichen Klassen (ähnlich wie in C#) und man benötigt man eine cpp-Datei (wie Form1.cpp), in der 1. "Classes.h" und die eigenen Klassen mit geincludet werden, und 2. mittels Classes::Application name(klasse::funktion) defineirt wird, wo das Hauptprogramm steht (also der main()-Ersatz).
Der Konstruktor definiert quasi einen Zeiger (Klasse Application, Element Run) auf das Hauptprogramm (Beispiel siehe oben).Jedenfalls MANY THNX für eure Hilfe. Wer interessiert ist, kann den Code auch für sich verwednen.

-
OOOPS, hab mich vertippt.
In classes.h wird Application::nInstance mit 0 initialisiert und nicht mit -1,
sorry
-
Warum nimmst du egtl nicht einfach C#? C++ scheint dir ja nicht zu gefallen wie's ist.
-
Ich hab ja auch C#. Ich wollte das ja nur, um etwas dazu zu lernen.
Und hierbei brauchte ich halt etwas Hilfe. So an sich ist doch C++ OK.Aber bestimmte Dinge anders zu machen als andere ist doch auch in Ordnung.
Alle die in C++ programmieren, schreiben ordentlich, brav ihr main() und ich wollt des halt ned. Gut, wenn ich etz blos a kleines Testprogramm hab, das mal blos "Hallo Welt" schreibt, dann mach ich sowas ned. Da schreib ich dann schon main()... aber für größeres könnte ich mir meine Variante scho vorstellen, vor allem weil ich C# bloß für WinXP hab und unter Linux "nur" C++.
Aber egal.Kurz: Es sollte mir eigentlich nur lernmäßig dienen.
-
Naja, ich mach dann für heut mal Schluss. Muss nochwas anderes auch machen außer bloß C++. Aber ich melde mich mal wieder.
CU@ALL
-
Wenn alle Programmiersprachen gleich wären, dann bräuchte man keine verschiedenen Sprachen..
Außerdem zwingt dich niemand alles in die Main zu stopfen. In einem C++ Programm kann die main() durchaus so aussehen:
int main() { Application app; return app.main(); //oder beliebiger anderer Name }In einer realen Anwendung wäre wahrscheinlich noch ein try..catch außen herum und man würde die Kommandozeile auswerten.
P.S. Das was du hier tust ist ein typischer Fall für www.thedailywtf.com weil du ein Problem löst das nicht existiert.
-
Robert K. schrieb:
Ich hab ja auch C#. Ich wollte das ja nur, um etwas dazu zu lernen.
Und hierbei brauchte ich halt etwas Hilfe. So an sich ist doch C++ OK.Aber bestimmte Dinge anders zu machen als andere ist doch auch in Ordnung.
Alle die in C++ programmieren, schreiben ordentlich, brav ihr main() und ich wollt des halt ned. Gut, wenn ich etz blos a kleines Testprogramm hab, das mal blos "Hallo Welt" schreibt, dann mach ich sowas ned. Da schreib ich dann schon main()... aber für größeres könnte ich mir meine Variante scho vorstellen, vor allem weil ich C# bloß für WinXP hab und unter Linux "nur" C++.
Aber egal..]
Früher oder später wirst Du noch lernen das es gute Gründe gibt warum gute Programmierer sich an Standarts, Design Patterns und Best Praktices halten. Mit der Einstellung die Du da zeigst wohl eher später und "the hard way".
Naja, solange Du es nciht als Job machen willst sondern nur als Hobby ists ziemlich egal

Oder um es mit einem Zitat aus eine Film zu sagen: "Wenn Du einen Nagel in die wand schlagen willst, dann nimm einen Hammer und schlag den Nagel in die Wand". Was Du machst ist eher der Versuch mit einer Hydraulikpresse den Nagel in die Wand zu drücken...
[quote="Robert K."]
Kurz: Es sollte mir eigentlich nur lernmäßig dienen.[/quoteUnd das Lernergebnis hätte sein sollen das der beste udn sinnvollste Weg in C++ immer noch ein simples
class Application { }; int main() { Application.Run() }wäre.
Ps: Bin selber ein begeisterter C# Progger... Das mal am Rande...