15

これは短くて単純な質問かもしれませんが、満足のいく答えを見つけたことはありません。

大規模な C++ プロジェクトでは、main() 関数は通常、どのコードで構成されていますか? 通常、(ラッピング) クラス オブジェクトを初期化し、その内部で関数を呼び出して物事を開始するだけだと考えるのは、間違った仮定でしょうか?

そもそも main() がメソッドではないのはなぜですか? Cとの下位互換性を維持するためですか?

4

9 に答える 9

10

私のコードでは、それは基本的にコンストラクター呼び出し、おそらくメソッド呼び出し、およびいくつかの例外処理です。これは私のプロジェクトのメインです(ヘッダーとコメントは省略され、いつものようにSOによってフォーマットがめちゃくちゃになっています):

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;
}
于 2009-08-01T17:34:52.620 に答える
2

私は通常そうします

  • コマンドライン解析
  • トップレベル オブジェクトの初期化
  • 例外処理
  • メインの「exec」ループに入る

私が理解しているように、int main(int argc, char *argv[])本質的にはC遺産による慣習です。私を奇妙だと思ったことは一度もありませんでしたが、むしろ便利でした。結局、C++ は C を拡張します ... (もちろん、細かい違いはありますが、それはここでは問題ではありませんでした)。

于 2009-08-01T17:28:55.657 に答える
2

はい、その理由は下位互換性です。main は、実行可能ファイルを生成する C プログラム、つまり C++ プログラムで許可される唯一のエントリ ポイントです。

C++ メインで何をするかについては、状況によって異なります。一般的に、私は以前は次のことを行っていました。

  • グローバルな初期化を実行します (例: ロギング サブシステムの)
  • コマンドライン引数を解析し、それらを含む適切なクラスを定義します
  • アプリケーション オブジェクトの割り当て、設定など。
  • アプリケーション オブジェクトを実行します (私の場合、無限ループ メソッド。GUI プログラミング)
  • オブジェクトがそのタスクを完了した後にファイナライズを行います。

ああ、私はアプリケーションの最も重要な部分を忘れていました

  • スプラッシュスクリーンを表示する
于 2009-08-01T17:29:00.073 に答える
1

私のmain()関数は、さまざまなトップレベルオブジェクトを作成し、それらに相互参照を与えることがよくあります。これにより、結合を最小限に抑え、メインに限定されたさまざまなトップレベルオブジェクト間の正確な関係を維持できます。

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

于 2009-08-01T21:44:01.180 に答える
1

簡単に言えば、状況によります。プログラムの実行中に必要ないくつかのローカル オブジェクトを作成し、構成し、相互に通知し、そのうちの 1 つで実行時間の長いメソッドを呼び出すこともできます。

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

グローバル エントリ ポイントとして、何mainを設定するかを選択できます。

于 2009-08-01T17:28:19.293 に答える
0

プロジェクト設定の詳細リンカー オプションでエントリ ポイントを選択することにより、MSVC++ コンパイラで main の代わりに静的クラス メンバー関数を使用できます。

そこに何を配置するかは、プロジェクトによって異なります...小さい場合は、メッセージループ、初期化、およびシャットダウンコードをそこに配置することもできます。大規模なプロジェクトでは、これらを独自のクラス/関数に移動するか、モノリシックなエントリ ポイント関数を持たないようにする必要があります。

于 2009-08-01T17:30:29.117 に答える
0

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

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

于 2009-08-01T17:30:31.770 に答える
0

非常に大規模なプロジェクトは、1 つのプログラムだけで構成されているわけではありません。したがって、それぞれ独自のメインを持つ複数の実行可能ファイルが存在します。ちなみに、これらの実行可能ファイルがキューを介して非同期に通信することは非常に一般的です。

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

main() がクラスのメソッドではなく関数である理由を教えてください。さて、それはどのクラスのメソッドでしょうか?ほとんどがCからのC++の遺産だと思いますが...すべてはどこかから始めなければなりません:-)

于 2009-08-01T17:30:36.370 に答える
0

私は通常、コマンド ラインでの読み取り、グローバル変数の初期化、および適切な関数/メソッドの呼び出しに main を使用します。

于 2009-08-01T17:35:50.650 に答える