次のようなコードがある場合
main(int argc, char *argv[])
{
...
#include "Class1.H"
#include "Class2.H"
...
}
通常、main() メソッドはすべてのアプリケーションの開始点であり、main() 内のコンテンツが実行されます。main() が開始されると、main() に含まれるすべてのクラスの内容が実行されるという仮定は正しいですか?
ご挨拶ストレート
いいえ、いいえ、いいえ。
まず第一に#include
、関数内にファイルはありません。#include
他の宣言の前に、ファイルの先頭にファイルを作成します。OK、どこでも使用できます#include
が、実際には使用しないでください。
第二に、何も実行#include
しません。基本的にはコピペのみの操作です。d ファイルの内容は、 (事実上) を配置した場所に正確に挿入されます。#include
#include
第 3 に、C++ でプログラミングを学習する場合は、推奨テキストのいずれかを選択することを検討してください。
あなたのコメント:
私は OpenFoam で multiphaseEulerFoam ソルバーを使用しており、multiphaseEulerFoam.C の main() 内にはクラスが含まれています。クラスには main() で呼び出される正しい構造があると思います
それは事実かもしれませんし、クラスが から呼び出される正しい構造を持っていることに疑いの余地はありませんmain
。問題はmain
、 s の後に不正な形式になる#include
ことです。これは、ローカル クラス定義があり、 内に他に何があるかを誰が知っているからですmain
。
このことを考慮。ヘッダーがある場合:
#ifndef FOO_H
#define FOO_H
class Foo
{
public:
Foo (const std::string& val)
:
mVal (val)
{
}
private:
std::string mVal;
};
#endif
そして、これをメインに含めようとします:
int main()
{
#include "foo.h"
}
ディレクティブを前処理した後#include
、コンパイラがコンパイルしようとする結果のファイルは次のようになります。
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()
{
}
このようなコードは避けるようにしてください。#include
ディレクティブは、ファイルの内容をその場所に挿入します。メイン関数内で Class1.H および Class2.H からファイル コンテンツをコピー アンド ペーストすることにより、コードの結果をシミュレートできます。
インクルードはどの関数またはクラス メソッド本体にも属していません。これは良い考えではありません。ヘッダー ファイルでいずれかのクラスをインスタンス化しない限り、コードは実行されません。
コードは次の場合に実行されます。
この例を試してください:
#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
}
実行すると、次のことがわかります。
test
、それを呼び出します。これは openFoam 構文であり、open Foam は#include
関数呼び出しのように扱うという彼の発言は正しい。OpenFoam#include Foo.H
では、別の階層レベルで行われるクラス宣言ではなく、コードを使用して実行されます。openFoam には C++ に組み込まれたものが非常に多く、動作するコードを生成するにはルールを破る必要があるため、openFoam 関連の質問はすべて C++ フォーラムで質問しないことをお勧めします。
クラスの宣言のみを含めています。コードを実行するには、クラス インスタンス (オブジェクト) を作成する必要があります。
#include
また、関数やクラス メソッド内には記述しないでください。多くの場合、コンパイルされません。