2009-08-01 6 views
16

にこれは短い&簡単な質問かもしれませんが、私はそれに満足のいく答えを見つけたことがありません:C++のmain()大OOPプロジェクト

main()関数は、通常はAでから構成さんは何のコード大規模なC + +プロジェクト?それは通常、(ラッピング)クラスオブジェクトを初期化し、その中の関数を呼び出して物事を止めることだと考えるのは誤った仮定ですか?

main()は最初の方法ではないのはなぜですか?それはCとの下位互換性を保持するのですか?

+1

メンバー関数ではない理由は、メンバー関数のどのクラスを指定する必要があるかということです。 C++は、Javaのマニフェストやリフレクションのようなものはありません。 –

+0

より概念的なレベルから、すべてのプログラムはエントリポイントを必要とします、 "古典的な" C++の場合、これはコンパイラが生成する実行可能ファイルの中にあります。インタプリタ言語では、ランタイムが最初に実行され、アプリケーションが起動する前に実行されるコンテキストが設定されるため、言語/ランタイムが許可していれば、以前に設定されたクラスのメソッド/メンバであるエントリポイントが可能です。 – Mark

+2

@マーク:何ですか?コンパイラは、main()が実行される前に、クラスの静的メンバーを含むさまざまなものを初期化するコードを発行します。実行時にC++でクラスが存在すると言えるほど、存在するクラスはたくさんあり、エントリポイントが呼び出される前に存在します。存在するオブジェクトもたくさんあります。 –

答えて

10

私のコードでは基本的にはコンストラクタ呼び出し、メソッド呼び出し、例外処理です。その後、私は通常、グローバル変数を初期化し、コマンドラインで読み取るための主に使用

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; 
} 
+0

あなたの 'result ='を 'return'に置き換えてみませんか? – GManNickG

+2

口を洗う!すべての適切に構造化されたコードでは、1つの終了点しか持たないという要件を聞いたことがありませんか?しかし、深刻なことに、検査する変数があるので、自分のやり方をデバッグするのが簡単です。 –

+0

ああ、私は笑を参照してください。あなたは私を怖がった。私は "FUUU-何?"のようだった。私はreturn変数を調べる必要がなかったと思います。私のエラーハンドラはそれを例外とともに出力します。それ以外のコードは同じです。 – GManNickG

1

短い答え:それは依存しています。それは、プログラムの期間中必要とされるいくつかのローカルオブジェクトを作成し、それらを構成し、お互いに話し、それらのいずれかで長時間実行するメソッドを呼び出すことがあります。

プログラムにはエントリポイントが必要です。 mainがオブジェクトのメソッドでなければならない場合は、どんなクラスタイプにする必要がありますか?

グローバルエントリポイントとしてmainを使用すると、セットアップするものを選択できます。

2

鉱山通常、トップレベルの

  • 初期化を解析するコマンドラインは、私はそれを理解したよう
  • 例外処理
  • がメイン '幹部' ループ
  • に入るオブジェクト

    • 行います、int main(int argc, char *argv[])は本質的にはC遺産のためです。私を奇妙に打つことはありませんでしたが、むしろ便利です。結局のところ、C++はCを拡張しています...(そして確かに違いはありますが、ここではそれは問題ではありませんでした)。

    2

    はい、その理由は下位互換です。 mainは、実行可能ファイルを生成するCプログラムで許可されている唯一のエントリポイントであり、したがってC++プログラムでのみ使用できます。

    C++メインで何をするかは、それに依存します。 (例えば、ロギング・サブシステムの)

  • パースコマンドライン引数グローバル初期化を実行し、
  • それらを含む適切なクラスは、など、それを設定、アプリケーションオブジェクトを割り当てる定義

    • :一般的には、私がするために使用しました
    • アプリケーションオブジェクトを実行します(私の場合、無限ループメソッド、GUIプログラミング)
    • オブジェクトがタスクを完了した後でファイナライズを行います。

    ああ、私は、アプリケーション

    • の最も重要な部分は、あなたが選択することで、MSVC++コンパイラで、メインの代わりにクラスの静的メンバ関数を使用することができますスプラッシュスクリーン
  • 0

    を示して忘れてしまいました高度なリンカオプションの下、プロジェクト設定のエントリポイント。

    本当にあなたが配置したいものはあなたのプロジェクトに依存します...もし小さければ、そこにメッセージループ、初期化とシャットダウンコードを入れることもできます。大規模なプロジェクトでは、これらを独自のクラス/関数に移動するか、モノリシックなエントリポイント機能を持たなくてはなりません。

    0

    すべてのC++アプリケーションがOOPであるとは限りません。また、すべてのコードでは、何らかのエントリポイントが必要です。

    私がOOPコードを書いているとき、私のmain()は、オブジェクトのインスタンス化を含む傾向があります。ユーザーの入力によって進められることがあります。私はこのようにしています。なぜなら、「仕事」がオブジェクト内で実行されることを意味しているからです。そうでなければ、コードはOOPの「精神」で書かれていません。

    0

    非常に大きなプロジェクトは、1つのプログラムで構成されない傾向があります。したがって、それぞれにメインの実行ファイルがいくつかあります。合格すると、これらの実行可能ファイルがキューを介して非同期で通信することは非常に一般的です。

    はい各メインは非常に小さく、フレームワークなどを初期化する傾向があります。

    main()がクラスのメソッドではなく関数であるのはなぜですか?さて、それはどのようなクラスですか?私はそれがC言語のC++の遺産だと思っていますが、すべてはどこかで始める必要があります:-)

    +1

    メインは関数であり、メソッドではありません... – micmoo

    +0

    ありがとうございます、そうです。 – djna

    0

    、と:これは、(ヘッダやコメントは省略し、いつものように、SOによって台無しに書式設定)私のプロジェクトの自分のための主要です適切な関数/メソッドを呼び出します。

    1

    私のmain()関数は、多くの場合、さまざまなトップレベルのオブジェクトを構築し、それらのオブジェクトに互いに参照を与えます。これにより、カップリングを最小限に抑え、メインに限定された異なるトップレベルオブジェクト間の正確な関係を維持します。

    多くの場合、これらの最上位レベルのオブジェクトは、init()、stop()、およびstart()メソッドを使用して異なるライフサイクルを持つことがあります。 main()関数は、オブジェクトを目的の実行状態にすることを管理し、シャットダウンする時間を示す何かを待ってから、制御された方法ですべてをシャットダウンします。ここでも、物事を適切に分離して維持し、トップレベルのライフサイクル管理を簡単に理解できる場所に保ちます。このパターンは反応系、特にスレッドが多いシステムでは多く見られます。

    関連する問題