クラスを作成して定義した後(「hファイル」内)。「hファイル」(クラスに属するもの)に加えて、「cppファイル」(クラスのみ)を作成する(または作成しない)にはどうすればよいですか?
3 に答える
これがあなたを動かすための小さな例です。
これはFooのヘッダーファイルです。それを「foo.h」と呼びましょう
#pragma once
#ifndef FOO_H
#define FOO_H
class Foo{
public:
void function();
protected:
private:
};
#endif
これはFooのソースファイルです。それを「foo.cpp」と呼びましょう
#include "foo.h"
void Foo::function(){
// ... implement ...
return;
}
それらを一緒にコンパイルして、オブジェクトファイルを作成できます。これを「foo.o」と呼びます。「foo.o」をリンクすれば、プログラムでクラスを使用できます。
例:
#include "foo.h"
int main(){
Foo foo;
foo.function();
return 0;
}
hファイルは記述子ファイルであり、関数/クラスのシグネチャを記述して、他のcppファイルの他のクラスがそれを使用できるようにします。
hファイルをコントラクトと考える必要があります。あなたは義務を宣言しています。
後で、cppを実装することを決定したとき、あなたは義務を果たしています。
他のclasses/cppファイルは、cppで義務を実装することを前提として、義務のみに依存する可能性があります。
例えば:
- .hファイル「myClassA.h」を作成し、myClassA.SayHello()というメンバーメソッドを使用してmyClassAというクラスを宣言します。
- myClassB.cppを作成する別のクラスにmyClassA.hを含めると、myClassBはmyClassAにSayHello()というメソッドがあり、それを呼び出すことができることを認識します。
- myClassA.hを含めずに、myClassB.cpp内でmyClassA.SayHello()を呼び出そうとすると、myClassBはmyClassAを「認識」しないため、コンパイラからエラーが発生します。
- hファイルを含めても、myClassA.cppでmyClassAを実際に作成して実装しなかった場合、実装が見つからなかったため、コンパイルエラーが発生します。
ベストプラクティスは、ヘッダーファイルと実装ファイルを分離して、ヘッダーファイル.h内にクラスを定義し、それを.cppファイル内に実装することです。これにより、エラーのトレースとデバッグに役立ち、クリーンなコードが表示されます。
テンプレートクラスでは、テンプレートを通常のクラスから分離することでコードを適切に構造化してクリーンに保つために、別のヘッダーファイルで定義する必要があることに注意してください。