C++ でヘッダーファイルを作成する

胡金庫 2023年10月12日
  1. C++ で .h または .hpp サフィックスを使用してヘッダーファイルを作成する
  2. ヘッダーファイルを使用して、モジュール内のプログラムの個別の機能ブロックを分解する
C++ でヘッダーファイルを作成する

この記事では、C++ でヘッダーファイルを作成する方法のいくつかの方法について説明します。

C++ で .h または .hpp サフィックスを使用してヘッダーファイルを作成する

現代のプログラムは、他の人によって実装されたコード構造であるライブラリなしで書かれることはめったにありません。C++ は、必要なライブラリヘッダーファイルと外部関数またはデータ構造をインポートするための特別なトークン #include を提供します。通常、ライブラリヘッダーファイルには、library_name.hlibrary_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);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Header