これは短くて単純な質問かもしれませんが、満足のいく答えを見つけたことはありません。
大規模な C++ プロジェクトでは、main() 関数は通常、どのコードで構成されていますか? 通常、(ラッピング) クラス オブジェクトを初期化し、その内部で関数を呼び出して物事を開始するだけだと考えるのは、間違った仮定でしょうか?
そもそも main() がメソッドではないのはなぜですか? Cとの下位互換性を維持するためですか?
私のコードでは、それは基本的にコンストラクター呼び出し、おそらくメソッド呼び出し、およびいくつかの例外処理です。これは私のプロジェクトのメインです(ヘッダーとコメントは省略され、いつものように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;
}
私は通常そうします
私が理解しているように、int main(int argc, char *argv[])
本質的にはC
遺産による慣習です。私を奇妙だと思ったことは一度もありませんでしたが、むしろ便利でした。結局、C++ は C を拡張します ... (もちろん、細かい違いはありますが、それはここでは問題ではありませんでした)。
はい、その理由は下位互換性です。main は、実行可能ファイルを生成する C プログラム、つまり C++ プログラムで許可される唯一のエントリ ポイントです。
C++ メインで何をするかについては、状況によって異なります。一般的に、私は以前は次のことを行っていました。
ああ、私はアプリケーションの最も重要な部分を忘れていました
私のmain()関数は、さまざまなトップレベルオブジェクトを作成し、それらに相互参照を与えることがよくあります。これにより、結合を最小限に抑え、メインに限定されたさまざまなトップレベルオブジェクト間の正確な関係を維持できます。
多くの場合、これらの最上位オブジェクトには、init()、stop()、およびstart()メソッドを使用した明確なライフサイクルがあります。main()関数は、オブジェクトを目的の実行状態にすることを管理し、シャットダウンする時間であることを示すものが何であれ待機してから、制御された方法ですべてをシャットダウンします。繰り返しになりますが、これは物事を適切に切り離し、トップレベルのライフサイクル管理を1つの簡単に理解できる場所に保つのに役立ちます。このパターンは、リアクティブシステム、特にスレッドが多いシステムでよく見られます。
簡単に言えば、状況によります。プログラムの実行中に必要ないくつかのローカル オブジェクトを作成し、構成し、相互に通知し、そのうちの 1 つで実行時間の長いメソッドを呼び出すこともできます。
プログラムにはエントリ ポイントが必要です。オブジェクトmain
のメソッドである必要がある場合、どのクラス タイプにする必要がありますか?
グローバル エントリ ポイントとして、何main
を設定するかを選択できます。
プロジェクト設定の詳細リンカー オプションでエントリ ポイントを選択することにより、MSVC++ コンパイラで main の代わりに静的クラス メンバー関数を使用できます。
そこに何を配置するかは、プロジェクトによって異なります...小さい場合は、メッセージループ、初期化、およびシャットダウンコードをそこに配置することもできます。大規模なプロジェクトでは、これらを独自のクラス/関数に移動するか、モノリシックなエントリ ポイント関数を持たないようにする必要があります。
すべての C++ アプリケーションが OOP であるとは限りません。いずれにせよ、すべてのコードには何らかのエントリ ポイントから開始する必要があります。
私が OOP コードを書いているときmain()
、オブジェクトのインスタンス化が含まれる傾向があり、おそらくユーザー入力によって進められます。「作業」はオブジェクト内で行われることを意図していると感じているため、私はこのようにしています。そうでなければ、コードは OOP の「精神」で書かれていません。
非常に大規模なプロジェクトは、1 つのプログラムだけで構成されているわけではありません。したがって、それぞれ独自のメインを持つ複数の実行可能ファイルが存在します。ちなみに、これらの実行可能ファイルがキューを介して非同期に通信することは非常に一般的です。
はい、各メインは非常に小さい傾向があり、フレームワークなどを初期化します。
main() がクラスのメソッドではなく関数である理由を教えてください。さて、それはどのクラスのメソッドでしょうか?ほとんどがCからのC++の遺産だと思いますが...すべてはどこかから始めなければなりません:-)
私は通常、コマンド ラインでの読み取り、グローバル変数の初期化、および適切な関数/メソッドの呼び出しに main を使用します。