在 C++ 中建立標頭檔案

Jinku Hu 2023年1月30日 2021年4月29日
  1. 使用 .h.hpp 字尾在 C++ 中建立標頭檔案
  2. 使用標頭檔案將程式中的獨立功能塊分解成模組
在 C++ 中建立標頭檔案

本文將解釋幾種如何在 C++ 中建立標頭檔案的方法。

使用 .h.hpp 字尾在 C++ 中建立標頭檔案

當代程式很少是在沒有庫的情況下編寫的,而庫是由其他人實現的程式碼構造。C++ 提供了特殊的標記-#include 來匯入所需的庫標頭檔案和外部函式或資料結構。請注意,通常,庫標頭檔案具有特定的檔名字尾,例如 library_name.hlibrary_name.hpp。C++ 程式結構提供了標頭檔案的概念,以簡化某些可重用程式碼塊的使用。因此,使用者可以建立自己的標頭檔案,並根據需要將其包括在原始檔中。

假設使用者需要實現一個名為 Point 的類,其中包含兩個型別為 double 的資料成員。該類具有兩個建構函式和其中定義的+ 運算子。它還具有列印函式,可將兩個資料成員的值輸出到 cout 流。通常,還有一些頭保護符將 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::cout; using std::cin;

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);
}
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn