1

次のようなコードがある場合

    main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...

}

通常、main() メソッドはすべてのアプリケーションの開始点であり、main() 内のコンテンツが実行されます。main() が開始されると、main() に含まれるすべてのクラスの内容が実行されるという仮定は正しいですか?

ご挨拶ストレート

4

6 に答える 6

8

いいえ、いいえ、いいえ

まず第一に#include、関数内にファイルはありません。#include他の宣言の前に、ファイルの先頭にファイルを作成します。OK、どこでも使用できます#includeが、実際には使用しないでください。

第二に、何も実行#includeしません。基本的にはコピペのみの操作です。d ファイルの内容は、 (事実上) を配置した場所に正確に挿入されます。#include#include

第 3 に、C++ でプログラミングを学習する場合は、推奨テキストのいずれかを選択することを検討してください。


あなたのコメント:

私は OpenFoam で multiphaseEulerFoam ソルバーを使用しており、multiphaseEulerFoam.C の main() 内にはクラスが含まれています。クラスには main() で呼び出される正しい構造があると思います

それは事実かもしれませんし、クラスが から呼び出される正しい構造を持っていることに疑いの余地はありませんmain。問題はmain、 s の後に不正な形式になる#includeことです。これは、ローカル クラス定義があり、 内に他に何があるかを誰が知っているからですmain

このことを考慮。ヘッダーがある場合:

foo.h

#ifndef FOO_H
#define FOO_H

class Foo
{
public:
  Foo (const std::string& val)
  :
    mVal (val)
  {
  }
private:
  std::string mVal;
};

#endif

そして、これをメインに含めようとします:

main.cpp

int main()
{
  #include "foo.h"
}

ディレクティブを前処理した後#include、コンパイラがコンパイルしようとする結果のファイルは次のようになります。

前処理された main.cpp

int main()
{
    #ifndef FOO_H
    #define FOO_H

    class Foo
    {
    public:
      Foo (const std::string& val)
      :
        mVal (val)
      {
      }
    private:
      std::string mVal;
    };

    #endif
}

これはあらゆる種類の間違いです。1 つ目は、このようにローカル クラスを宣言することはできません。2つ目は、Fooあなたが想定しているように、「実行」されません。

main.cpp は次のようになります。

#include "foo.h"

int main()
{
}
于 2013-10-31T12:57:20.910 に答える
3

このようなコードは避けるようにしてください。#includeディレクティブは、ファイルの内容をその場所に挿入します。メイン関数内で Class1.H および Class2.H からファイル コンテンツをコピー アンド ペーストすることにより、コードの結果をシミュレートできます。

于 2013-10-31T12:56:54.807 に答える
2

インクルードはどの関数またはクラス メソッド本体にも属していません。これは良い考えではありません。ヘッダー ファイルでいずれかのクラスをインスタンス化しない限り、コードは実行されません。

コードは次の場合に実行されます。

  1. クラスがインスタンス化され、そのコンストラクター メソッドが呼び出され、メソッド内のコードが実行されます。
  2. インスタンス化されたクラス内にクラス型の変数がある場合、それらもコンストラクターを実行します。
  3. クラスメソッドを呼び出すとき。

この例を試してください:

#include <iostream>
using namespace std;

int main()
{
    class A
    { public:
        A() { cout << "A constructor called" << endl; }
    };
    // A has no instances
    class B
    { public:
        B() { cout << "B constructor called" << endl; }
        void test() { cout << "B test called" << endl; }
    } bbb;
    // bbb will be new class instance of B
    bbb.test(); // example call of test method of bbb instance
    B ccc;      // another class instance of B
    ccc.test(); // another call, this time of ccc instance
}

実行すると、次のことがわかります。

  1. クラス A のインスタンスは作成されません。クラス A からは何も実行されません。
  2. bbb と ccc をインスタンス化すると、それらのコンストラクターが実行されます。他のコードを実行するには、まずメソッドを作成する必要があります。たとえばtest、それを呼び出します。
于 2013-10-31T12:55:13.170 に答える
1

これは openFoam 構文であり、open Foam は#include関数呼び出しのように扱うという彼の発言は正しい。OpenFoam#include Foo.Hでは、別の階層レベルで行われるクラス宣言ではなく、コードを使用して実行されます。openFoam には C++ に組み込まれたものが非常に多く、動作するコードを生成するにはルールを破る必要があるため、openFoam 関連の質問はすべて C++ フォーラムで質問しないことをお勧めします。

于 2014-09-09T12:45:50.793 に答える
0

クラスの宣言のみを含めています。コードを実行するには、クラス インスタンス (オブジェクト) を作成する必要があります。

#includeまた、関数やクラス メソッド内には記述しないでください。多くの場合、コンパイルされません。

于 2013-10-31T12:55:41.557 に答える