Что я только что прочитал? Вы кажется не понимаете, зачем нужны хедеры, там должно быть определения всего что вы используете, а реализация в *.cpp. Распространённая практика - для классов использовать .h с определением и .cpp файл с реализацией, имя файлов совпадает с именем класса, в .h нужно использовать #pragma once или костыль include guard. Напрмер:
Color.h:
#pragma once
// или так
// #ifndef COLOR_H
// #define COLOR_H
class Color {
public:
Color(unsigned char red, unsigned char green, unsigned char blue);
private:
unsigned char red, green, blue
};
// #endif
Color.cpp:
#include "Color.h"
Color::Color(unsigned char red, unsigned char green, unsigned char blue)
: red(red), green(green), blue(blue)
{
}
Из правила есть одно исключение - шаблоны, обычно их пихают в хедер с расширением .hpp, чтоб было видно, что это шаблоны, cpp для шаблонов сделать не получится.
Можно конечно весь код писать в хедерах, но тогда при малейшем изменении перекомпиливается весь проект.