Обычно в заголовках идут объявления, а в исходных файлах - реализация.Хотя для шаблонов есть исключение.Помните, что компилируются только исходные файлы.Таким образом, все символы, присутствующие в исходном файле, должны быть известны компилятору.Теперь рассмотрим пример -
foo.h
struct foo
{
int number ;
foo( int x );
};
foo.cpp
Теперьэто метод, который не реализован в struct foo
, т.е. конструктор.Если вам нужно реализовать это в отдельном исходном файле, вам нужно #include "foo.h"
.Без этого, если вы просто продолжите реализовывать его методы, компилятор не знает, что такое "foo".
#include "foo.h"
foo::foo( int x )
{
number = x; // This can be achieved through initializer lists too.
}
Еще до этапа компиляции препроцессор копирует содержимое foo.h
в foo.cpp
.После предварительной обработки исходный foo.cpp
превращается в -
struct foo
{
int number ;
foo( int x );
};
foo::foo( int x )
{
number = x; // This can be achieved through initializer lists too.
}
Теперь каждый метод / символ, который определяется / используется в исходном файле, известен компилятору, которому он передается.И вообще, соответствующий исходный файл x.h
будет x.cpp
.Также знайте, что каждый исходный файл проходит эти этапы, чтобы получить окончательный исполняемый файл.( PreProcessor -> Компилятор -> Линкер ).Надеюсь, это поможет до такой степени.