0

次のコードを見てください

メイン.cpp

#include <iostream>

using namespace std;

int main()
{
    Class1 c;
}

Class1.cpp

#include <iostream>

using namespace std;

class Class1
{
public:
    void click1()
    {
        cout << "Click 1" << endl;
    }
};

Class2.cpp

#include <iostream>

using namespace std;

class Class2
{
public:
    void click2()
    {
        cout << "Click 2" << endl;
    }
};

上記のクラスにヘッダー ファイルを追加すると、機能します。C++ がヘッダー ファイルなしで異なるファイルのクラスを理解しないのはなぜですか?

4

4 に答える 4

6

C++ では、ソース ファイルは翻訳単位と呼ばれます。各翻訳単位は互いに独立しており、基本的に互いの存在を知りません。翻訳単位が知っておくべきことをコンパイラに明示的に伝える必要があります。

これは、物事を宣言することによって行われます。そして、多くのファイルや場所で同じ宣言を行う代わりに、すべてのソース ファイルに含まれる 1 つのヘッダー ファイルにそれらを配置します。

于 2013-03-01T14:26:58.810 に答える
1

なぜC++はヘッダーファイルのない異なるファイルのクラスを理解しないのですか?

なぜそれが必要ですか?ファイル名に特定の名前を付けることや、ファイルごとに1つのパブリッククラスを含めることを要求する規則はありません。論理的に意味がある限り、クラス階層全体を1つのヘッダーファイルに自由に配置できます。たとえば、<algorithms>ヘッダーにはと呼ばれるものは含まれていません"algorithms"が、名前は非常に直感的です。

最後に、C ++では、クラスまたはクラステンプレート内にあるものである必要はありません。名前空間レベルのCスタイル関数の宣言でいっぱいのファイルを持つことができます。この種のファイルをサポートするために導入する合理的な命名規則はありません。

ディレクティブは#includeこの問題を解決し、ファイルに希望どおりの名前を付ける柔軟性を提供します。

于 2013-03-01T14:25:26.440 に答える
1

なぜC++はヘッダーファイルのない異なるファイルのクラスを理解しないのですか?

これが、C ++の(悪い)コンパイルモデルの仕組みです。

コンパイラは、各変換ユニット(.cppファイル)を個別に処理します。次に、個々のコンパイルユニットの処理によって生成されたすべてのオブジェクトファイルがリンカーによってマージされ、プログラムの実行可能ファイルが作成されます。

1つの変換単位を処理している間、コンパイラーは、他の変換単位を処理している間に解析されたエンティティーを認識しません。

上記のクラスにヘッダーファイルを追加すると、それらは機能します

これ#includeは、対応するヘッダーを使用すると、それらのエンティティの宣言(または定義)が、それらを使用する必要のある各変換ユニットに表示されるためです。

于 2013-03-01T14:25:51.717 に答える
1

ヘッダーファイルの目的は、主にアイテムを宣言することです。C ++では、クラスや変数などの宣言が常に存在する必要があります。これらを指定しないと、コンパイラは対応するクラスや変数などを見つけることができません。

SOを参照してください。

于 2013-03-01T14:26:23.863 に答える