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