Fusion of Engineering, Control, Coding, Machine Learning, and Science

Separate C++ Classes into Header and Implementation Files – Complete Tutorial with an Example

In this C++ tutorial, we explain how to properly implement and separate C++ classes into header and implementation files. The YouTube tutorial accompanying this webpage tutorial is given below.

How to Properly Separate C++ Classes into Header and Implementation Files - C++ for Robotics/ML

Reasons and Best Practices for Implementing C++ Classes and Separating them Into Header (Interface) and Implementation Files

How the C++ Code Should be Organized

Suppose that we have a program consisting of a single class and a driver program. A good practice that leads to reusable code is to split the program into three files:

  1. Interface file. The class definition should be placed in a header file with an extension .h or .hpp. This file is called the interface file of the class.
  2. Implementation file. The definition (implementation) of all class member functions should be placed in another file with an extension “.cpp” (or a similar extension). This file must contain an include directive that includes the header file (interface file) of the class. The interface and implementation file should have the same name and different extensions (for example class1.h and class1.cpp). The implementation file is usually compiled separately from the application file (also known as the driver file or the main file).
  3. Application file (also known as the driver file or the main file). This file contains the main program and uses the defined class. The application file has to have an include statement “class1.h”. The application file is compiled separately from the implementation file. The compiled files (object files) of the application and implementation files are linked later on.  

When we write an include statement, we need to specify if the file to be included is predefined that is provided to us, or it is a file that we wrote:

It is a tradition to give the same names to the header and implementation files. That is, if the header file is “class1.h”, the implementation file should be “class1.cpp”. We need to compile the implementation and application files, and we do not need to compile the header files since they are included. Both the implementation and application files contain the include directive #include “class1.h”. By compiling the files, the compiler invokes a preprocessor that reads this include statement and whenever it is encountered it replaces it with the content of the file class1.h.

C++ Example on How to Separate a User-Defined Class Into Header (Interface) and Implementation Files

Here, we define a class called “Student”. This class will have two private member variables: student name and student age . Then, we will define a default constructor that will set the name to “No name” and age to 0. Then, we will define a member function that will set the name and age after an object of the class is defined. Finally, we will define a member function that will print the name and the age.

The first step is to define the interface or the header file. The file name should be “Student.h”, and the file is given below

#ifndef STUDENT_H
#define STUDENT_H
#include<iostream>
#include<cstdlib>
#include<string>

using namespace std;

class Student 
{
    public:
        // This constructor will set studentName to "No name" and studentAge to 0
        Student();
        // This function sets studentName=name, studentAge=age, once the object is constructed
        void SetNameAge(string name, int age);
        // This function will print studentName and studentAge
        void PrintNameAge();

    private:
        string studentName;
        int studentAge;
};



#endif

Next, we need to write the implementation file. We call this file “Student.cpp”. The file is given below.

#include<iostream>
#include<string>
#include<cstdlib>

#include "Student.h"

using namespace std;

Student::Student()
{
        studentName="No Name";
        studentAge=0;
}

 void Student::SetNameAge(string name, int age)
 {
    studentName=name;
    studentAge=age;
 }

 void Student::PrintNameAge()
 {
    cout<<"Student name is "<<studentName<<endl;
    cout<<"Student age is "<<studentAge<<endl;
 }

Finally, the application file or the main file that is also called as the drive file is given below. We save this file as “applicationFile.cpp”

#include<iostream>
#include<string>
#include<cstdlib>

#include "Student.h"

using namespace std;


int main()
{
    Student Student1;
    Student1.SetNameAge("John Smith", 30);
    Student1.PrintNameAge();
    return 0;
}

To compile all the files and to create an executable file, save all the files in the same folder and then open a terminal (Windows Command Prompt), and navigate to the folder containing the files. Then type

g++ *.cpp -o output

This will compile all the cpp files (Student.cpp and applicationFile.cpp) and it link the compiled files and create an executable file called “output.exe”. Then you can execute this file by typing in the terminal “output”. This will run the program. The output should be:

Student name is John Smith
Student age is 30

Exit mobile version