В заголовочных файлах должны быть объявления, в cpp-файлах - определения.
Код заголовочного файла вставляется в каждый cpp, который его включает. Поэтому, если вы напишите в заголовочном файле
int N = 42; в каждом cpp создастся новая переменная, если же вы добавите только объявление
extern int N, компилятор поймёт, что переменную нужно искать в другом месте
extern int N; // variable declaration
int N; // variable definition
// function declaration
float f(float x, float y);
// function definition
float f(float x, float y)
{
return x + y;
}
// class declaration
class Foo
{
public:
Foo();
void bar();
private:
static int baz;
}
// class member definition
Foo::Foo()
{
// do some stuff
}
// class member definition
void Foo::bar()
{
// do some stuff
}
// class member definition
int Foo::baz = 42;