Crea un file di intestazione in C++

Jinku Hu 12 ottobre 2023
  1. Usa i suffissi .h o .hpp per creare un file di intestazione in C++
  2. Utilizzare i file di intestazione per suddividere i blocchi funzione separati del programma nei moduli
Crea un file di intestazione in C++

Questo articolo spiegherà diversi metodi su come creare un file di intestazione in C++.

Usa i suffissi .h o .hpp per creare un file di intestazione in C++

I programmi contemporanei sono raramente scritti senza librerie, che sono costrutti di codice implementati da altri. C++ fornisce un token speciale - #include per importare i file di intestazione della libreria necessari e le funzioni esterne o le strutture di dati. Notare che, in genere, i file di intestazione della libreria hanno un suffisso del nome di file particolare come library_name.h o library_name.hpp. La struttura del programma C++ fornisce il concetto di file di intestazione per facilitare l’utilizzo di determinati blocchi di codice riutilizzabili. Pertanto, gli utenti possono creare i propri file di intestazione e includerli nei file di origine secondo necessità.

Supponiamo che l’utente debba implementare una classe denominata Point contenente due membri di dati di tipo double. La classe ha due costruttori e l’operatore + definito al suo interno. Ha anche una funzione print per inviare i valori di entrambi i membri dati al flusso cout. In generale, ci sono anche protezioni per le intestazioni che racchiudono la definizione della classe Point per garantire che non si verifichino conflitti di nome quando vengono inclusi in programmi relativamente grandi. Notare che dovrebbe esserci uno schema di denominazione coerente per i nomi delle variabili definiti dopo include guard; di solito, queste variabili prendono il nome dalla classe stessa.

#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

Un altro metodo per strutturare un file di intestazione per la classe Point consiste nell’includere il codice di implementazione della funzione nello stesso file. Nota che inserire il frammento di codice precedente in un file Point.hpp e includerlo solleverà diversi errori non definiti. Poiché le funzioni sono definite nel seguente codice di esempio, possiamo includerlo come file di intestazione Point.hpp e utilizzare la classe con i suoi metodi.

#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

Utilizzare i file di intestazione per suddividere i blocchi funzione separati del programma nei moduli

In alternativa, è possibile utilizzare uno schema di separazione basato su moduli per le intestazioni e i file sorgente corrispondenti della classe data per implementare una struttura di file di progetto più flessibile. In questo progetto, si dovrebbe definire ogni classe funzionalmente distinta in un file di intestazione .hpp separato e implementare i suoi metodi in un file sorgente con lo stesso nome. Una volta che il file di intestazione necessario della classe è incluso nel file sorgente principale e compilato, il preprocessore combinerà i blocchi di codice da tutti i file di intestazione inclusi e il risultato sarebbe lo stesso della compilazione del seguente codice sorgente, che implementa la funzionalità in un unico file sorgente.

#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);
}
Autore: 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 Facebook