Frage

Dies kann eine kurze und einfache Frage, aber ich habe noch nie eine befriedigende Antwort darauf gefunden:

Welchen Code hat die Funktion main () in der Regel besteht aus in einem großen C ++ Projekt? Wäre es eine falsche Annahme zu glauben, dass es in der Regel nur ein (Verpackung) Klassenobjekt wird initialisiert und der Aufruf eine Funktion in der es die Dinge auf den Weg?

Warum ist main () kein Verfahren in erster Linie? Ist es zu bewahren Rückwärtskompatibilität mit C?

War es hilfreich?

Lösung

In meinem Code, es ist im Grunde ein Konstruktoraufruf, möglicherweise ein Methodenaufruf, und einige Ausnahmebehandlung. Dies ist die wichtigste für eigene meine Projekte (Header und Kommentare weggelassen, und die Formatierung von SO, wie üblich verkorksten):

int main( int argc, char * argv[] ) {
    int result = 0;
    try {
        CLIHandler ch( argc, argv );
        result = ch.ExecCommand();
    }
    catch( const Exception & ex ) {
        result = ExceptionHandler::HandleMyError( ex );
    }
    catch( const std::exception & ex ) {
        result = ExceptionHandler::HandleOtherError( ex );
    }
    catch( ... ) {
        result = ExceptionHandler::HandleUnknownError();
    }
    return result;
}

Andere Tipps

Grube in der Regel tun

  • Befehlszeilen Parsen
  • Initialisierung von Top-Level-Objekte
  • Ausnahmebehandlung
  • main 'exec' loop Eingabe von

Wie ich es verstehe, int main(int argc, char *argv[]) ist im Wesentlichen eine Konvention aufgrund des C Erbe. Nie kam mir seltsam vor, sondern als nützlich. C ++ erweitert C nachdem alle ... (und ja, es gibt feinen Unterschied, aber das war nicht die Frage hier).

Ja, das ist der Grund, Abwärtskompatibilität. Haupt ist der einzige in einem C-Programm erlaubt Eintrittspunkt Executables produzieren und daher in einem C ++ Programm.

Wie für das, was in einem C ++ Haupt zu tun, es hängt. Im Allgemeinen habe ich an:

  • führen globale Initialisierung (zum Beispiel des Logging-Subsystem)
  • Parse-Befehlszeilenargumente und eine richtige Klasse definieren, welche sie enthalten
  • zuteilen ein Anwendungsobjekt, es einrichten etc.
  • Führen Sie das Anwendungsobjekt (in meinem Fall eine Endlosschleife Methode. GUI-Programmierung)
  • Abschluss, nachdem das Objekt seine Aufgabe abgeschlossen hat.

ach ja, und ich habe vergessen, den wichtigsten Teil einer Anwendung

  • zeigt den Begrüßungsbildschirm

Die kurze Antwort: Es hängt davon ab. Es kann auch ein paar lokale Objekte erstellen, die für die Dauer des Programms erforderlich sind, konfigurieren Sie sie, sagen sie umeinander und rufen eine lange Lauf Methode auf einem von ihnen.

Ein Programm benötigt einen Einstiegspunkt. Wenn main hatte eine Methode für ein Objekt sein, welche Klasse Typ sollte es sein?

Mit main als globalem Einstiegspunkt kann wählen, was bis setzen.

Meine Funktion main () baut oft verschiedene Top-Level-Objekte, so dass sie Verweise auf einander zu geben. Dies hilft, die Kopplung zu minimieren, um die genaue Beziehungen zwischen den verschiedenen Top-Level-Objekten auf die Haupt beschränkt zu halten.

Oft diese Top-Level-Objekte haben unterschiedliche Lebenszyklen, mit init (), stop () und start () Methoden. Die Funktion main () verwaltet die Objekte in den gewünschten Betriebszustand erhalten, wartet auf was auch immer gibt es an der Zeit ist, herunterzufahren und dann alles herunter in einer kontrollierten Art und Weise nach unten. Auch hier hilft diese Dinge zu halten richtig entkoppelt, und hält Management Top-Level-Lebenszyklus in einem leicht Ort verstanden. Ich sehe dieses Muster eine Menge in reaktiven Systemen, vor allem solche mit vielen Threads.

Sie können durch die Wahl der Eintrittspunkt in den Projekteinstellungen mit dem MSVC ++ Compiler eine statische Elementfunktion der Klasse anstelle des Haupt verwenden, unter den erweiterten Linker-Optionen.

Es hängt wirklich von Ihrem Projekt, was Sie dort platzieren wollen ... wenn es klein ist, dass Sie auch Nachricht setzen können Schleifen, Initialisierung und Shutdown-Code in dort. In größeren Projekten werden Sie diese in ihre eigenen Klassen / Funktionen oder weniger haben eine monolithische Eintrittspunktfunktion bewegen müssen.

Nicht alle C ++ Anwendungen sind OOP und so oder so alle Code einigen Einstiegspunkt erfordert starten aus.

Wenn ich OOP Code ich schreibe, meine main() neigt dazu, eine Objektinstanziierung aufzunehmen, vielleicht von einigen Benutzereingabe fort. Ich mache es so, weil ich, dass die ‚Arbeit‘ fühlen sollte innerhalb eines Objekts durchgeführt werden, sonst wird der Code in dem ‚Geist‘ der OOP nicht geschrieben.

ich in der Regel Haupt verwenden für in der Befehlszeile zu lesen, Initialisieren globaler Variablen, und dann die entsprechenden Funktionen / Methoden aufrufen.

Wirklich große Projekte umfassen neigen dazu, nicht nur ein einziges Programm. Daher wird es mehr ausführbare Dateien jeweils mit ihrem eigenen Haupt sein. Nebenbei ist es durchaus üblich, diese ausführbaren Dateien asynchron über Warteschlangen zu kommunizieren.

Ja jedes Haupt neigt sehr klein zu sein, einen Rahmen der Initialisierungsphase oder was auch immer.

Meinen Sie, warum Haupt ist () eine Funktion eher als eine Methode der Klasse? Nun, was Klasse wäre es ein Verfahren sein? Ich denke, es ist vor allem C ++ 's Erbe von C, aber ... alles bekam irgendwo :-)

starten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top