Search code examples
c++classheader-files

Separate classes into headers and source files in C++


How do I separate classes into multiple files? Here is my understanding so far:

  1. Create new class, and a ".h" and a ".cpp" file for it.
  2. You use #include classname.h in your main source file to import its contents.
  3. The Classname::Classname at the beginning of the source file is a Scope Resolution Operator.
  4. You can call functions from main by using the objects that you have declared.

I'm just confused about how to implement this in practice. I have created a working calculator program with all the classes in one source file:

#include <iostream>
using namespace std;

class Addition {
    public:
    float add(float x, float y) {
        float sum;
        sum = x + y;
        return sum;
    }
};

class Subtraction {
    public:
    float subtract(float x, float y) {
        float dif;
        dif = x - y;
        return dif;
    }
};

class Multiplication {
    public:
    float multiply(float x, float y) {
        float prod;
        prod = x * y;
        return prod;
    }
};

class Division {
    public:
    float divide(float x, float y) {
        float quot;
        quot = x / y;
        return quot;
    }
};

int op;
char cont;

int main() {
    do {
    cout << "Welcome to C++ Calculator v2!" << endl;
    cout << "Select the number for which operation you want to use: " << endl;
    cout << "1-Addition" << endl;
    cout << "2-Subtraction" << endl;
    cout << "3-Mutliplication" << endl;
    cout << "4-Division" << endl;
    cin >> op;

    if (op == 1) {
        float num1;
        float num2;
        Addition addObj;
        cout << "You have chosen Addition!" << endl;
        cout << "Enter the first number you want to add: " << endl;
        cin >> num1;
        cout << "Enter the second number you wat to add: " << endl;
        cin >> num2;
        float ans = addObj.add(num1, num2);
        cout << "The sum is " << ans << endl;
        cout << "Do you wish to continue? Y/N" << endl;
        cin >> cont;
    }

    if (op == 2) {
        float num1;
        float num2;
        Subtraction subObj;
        cout << "You have chosen Subtraction!" << endl;
        cout << "Enter the first number you want to subtract: " << endl;
        cin >> num1;
        cout << "Enter the second number you want to subtract: " << endl;
        cin >> num2;
        float ans = subObj.subtract(num1, num2);
        cout << "The difference is " << ans << endl;
        cout << "Do you wish to continue? Y/N" << endl;
        cin >> cont;
    }

    if (op == 3) {
        float num1;
        float num2;
        Multiplication multObj;
        cout << "You have chosen Multiplication!" << endl;
        cout << "Enter the first number you want to multiply: " << endl;
        cin >> num1;
        cout << "Enter the second number you want to multiply: " << endl;
        cin >> num2;
        float ans = multObj.multiply(num1, num2);
        cout << "The product is " << ans << endl;
        cout << "Do you wish to continue? Y/N" << endl;
        cin >> cont;
    }

    if (op == 4) {
        float num1;
        float num2;
        Division divObj;
        cout << "You have chosen Division!" << endl;
        cout << "Enter the first number you want to divide: " << endl;
        cin >> num1;
        cout << "Enter the second number you want to divide: " << endl;
        cin >> num2;
        float ans = divObj.divide(num1, num2);
        cout << "The quotient is " << ans << endl;
        cout << "Do you wish to continue? Y/N" << endl;
        cin >> cont;
    }

    } while (cont == 'Y' || cont == 'y');

    if (cont == 'N' || 'n') {
    cout << "Thanks for using my program, goodbye!" << endl;
    }

    return 0;
}

I know there is a lot easier way to make something like this, but I've used classes and objects instead for the sole purpose of practice.


Solution

  • Ok, I will show you by doing your example:

    subtraction.h

    class Subtraction 
    {
    public:
     float subtract (float x, float y);
    };
    

    subtraction.cxx

    #include "subtraction.h"
    
    float Subtraction::subtract (float x, float y)
    {     
      float dif;
      dif=x-y;
      return dif;    
    }
    

    multiplication.h

    class Multiplication 
    {
    public:
      float multiply (float x, float y);
    };
    

    multiplication.cxx

    #include "multiplication.h"
    
    float Multiplication::multiply (float x, float y)
    {
      float prod;
      prod=x*y;
      return prod;
    }
    

    and so on...

    main.cxx

    #include "subtraction.h"
    #include "multiplication.h"
    
    int main()
    {
     //use the classes just as before.
    }
    

    Also, I didn't put it in the code here, for simplicity, but go ahead and get into the habit of ensuring that your declarations are only included once. On a large project, this can get very nasty if you don't put these safeguards in.

    #ifndef SUBTRACTION_H
    #define SUBTRACTION_H
    
    class Subtraction
    {
         ....
    };
    #endif /*SUBTRACTION_H*/