C++ でヘッダーファイルを作成する
この記事では、C++ でヘッダーファイルを作成する方法のいくつかの方法について説明します。
C++ で .h
または .hpp
サフィックスを使用してヘッダーファイルを作成する
現代のプログラムは、他の人によって実装されたコード構造であるライブラリなしで書かれることはめったにありません。C++ は、必要なライブラリヘッダーファイルと外部関数またはデータ構造をインポートするための特別なトークン #include
を提供します。通常、ライブラリヘッダーファイルには、library_name.h
や library_name.hpp
などの特定のファイル名サフィックスが付いていることに注意してください。C++ プログラム構造は、特定の再利用可能なコードブロックの使用を容易にするヘッダーファイルの概念を提供します。したがって、ユーザーは独自のヘッダーファイルを作成し、必要に応じてそれらをソースファイルに含めることができます。
ユーザーが、タイプ double
の 2つのデータメンバーを含む Point
という名前のクラスを実装する必要があるとします。このクラスには、2つのコンストラクターと+
演算子が定義されています。また、両方のデータメンバーの値を cout
ストリームに出力する print
関数もあります。一般に、比較的大きなプログラムに含めるときに名前の衝突が発生しないように、Point
クラス定義を囲むヘッダーガードもあります。インクルードガードの後に定義された変数名には、一貫した命名スキームが必要であることに注意してください。通常、これらの変数はクラス自体にちなんで名付けられます。
#ifndef POINT_H
#define POINT_H
class Point {
double x, y;
public:
Point();
Point(double, double);
Point operator+(const Point &other) const;
void print();
};
#endif
Point
クラスのヘッダーファイルを構造化する別の方法は、同じファイルに関数実装コードをインクルードすることです。前のコードスニペットを Point.hpp
ファイルに入れて含めると、いくつかの未定義のエラーが発生することに注意してください。関数は次のサンプルコードで定義されているため、Point.hpp
ヘッダーファイルとしてインクルードし、そのメソッドでクラスを使用できます。
#include <iostream>
#include <vector>
#ifndef POINT_H
#define POINT_H
class Point {
double x, y;
public:
Point();
Point(double, double);
Point operator+(const Point &other) const;
void print();
};
Point::Point() { x = y = 0.0; }
Point::Point(double a, double b) {
x = a;
y = b;
}
Point Point::operator+(const Point &other) const {
return {x + other.x, y + other.y};
}
void Point::print() { std::cout << "(" << x << "," << y << ")" << std::endl; }
#endif
ヘッダーファイルを使用して、モジュール内のプログラムの個別の機能ブロックを分解する
あるいは、特定のクラスのヘッダーと対応するソースファイルにモジュールベースの分離スキームを利用して、より柔軟なプロジェクトファイル構造を実装することもできます。この設計では、機能的に異なる各クラスを個別の .hpp
ヘッダーファイルで定義し、そのメソッドを同じ名前のソースファイルに実装する必要があります。クラスに必要なヘッダーファイルがメインソースファイルにインクルードされてコンパイルされると、プリプロセッサはインクルードされたすべてのヘッダーファイルのコードブロックを結合し、その結果、単一のソースファイルに機能を実装した以下のソースコードをコンパイルしたのと同じになります。
#include <iostream>
#include <vector>
#ifndef POINT_H
#define POINT_H
class Point {
double x, y;
public:
Point();
Point(double, double);
Point operator+(const Point &other) const;
void print();
};
Point::Point() { x = y = 0.0; }
Point::Point(double a, double b) {
x = a;
y = b;
}
Point Point::operator+(const Point &other) const {
return {x + other.x, y + other.y};
}
void Point::print() { std::cout << "(" << x << "," << y << ")" << std::endl; }
#endif
using std::cin;
using std::cout;
int main() {
double x, y;
cin >> x >> y;
Point a1(x, y);
cin >> x >> y;
Point a2(x, y);
cout << "a1: ";
a1.print();
cout << "a2: ";
a2.print();
a1 = a1 + a2;
cout << "a1+a2: ";
a1.print();
exit(EXIT_SUCCESS);
}