The class declaration should be in the header file (Or in the source file if not shared).
File: foo.h
class foo
{
private:
static int i;
};
But the initialization should be in source file.
File: foo.cpp
int foo::i = 0;
If the initialization is in the header file then each file that includes the header file will have a definition of the static member. Thus during the link phase you will get linker errors as the code to initialize the variable will be defined in multiple source files.
Note: Matt Curtis: points out that C++ allows the simplification of the above if the static member variable is const POD (Plain Old Data) then you can declare and initialize in the header file.
class foo
{
private:
static int const i = 42;
};