.hh (или .h) файлы должны быть для объявлений.
.cpp (или .cc) файлы должны быть для определений и реализаций.
Сначала поймите, чтооператор #include литерал .#include "foo.h"
буквально копирует содержимое файла foo.h и вставляет его туда, где директива include находится в другом файле.
Идея состоит в том, что некоторые другие файлы bar.cpp и baz.cpp могут захотеть использоватьнекоторый код, который существует в foo.cc.Обычно это можно сделать для bar.cpp и baz.cpp до #include "foo.h"
, чтобы получить объявления функций или классов, которые они хотят использовать, и затем во время компоновки компоновщик подключит эти варианты использования.в bar.cpp и baz.cpp к реализациям в foo.cpp (в этом весь смысл компоновщика).
Если вы поместите все в foo.h и попытаетесь это сделать, у вас возникнет проблема,Скажем, что foo.h объявляет функцию с именем doFoo()
.Если определение (код для) этой функции находится в foo.cc, это нормально.Но если код для doFoo()
перемещен в foo.h, а затем вы включили foo.h в foo.cpp, bar.cpp и baz.cpp, теперь есть три определения для функции с именем doFoo()
, и вашкомпоновщик будет жаловаться, потому что вам не разрешено иметь более одной вещи с одним и тем же именем в одной и той же области видимости.