Para los futuros espectadores de esta pregunta, quiero señalar que deben evitar lo que monkey0506 sugiere .
Los archivos de encabezado son para declaraciones.
Los archivos de encabezado se compilan una vez por cada .cpparchivo que los directa o indirectamente #includes, y el código fuera de cualquier función se ejecuta en la inicialización del programa, antesmain() .
Al poner: foo::i = VALUE;en el encabezado, foo:ise le asignará el valor VALUE(lo que sea que sea) para cada .cpparchivo, y estas asignaciones sucederán en un orden indeterminado (determinado por el vinculador) antes de main()ejecutarse.
¿Qué pasa si somos #define VALUEun número diferente en uno de nuestros .cpparchivos? Se compilará bien y no tendremos forma de saber cuál gana hasta que ejecutemos el programa.
Nunca coloque el código ejecutado en un encabezado por la misma razón que nunca #includeun .cpparchivo.
incluir guardias (que estoy de acuerdo en que siempre debe usar) lo protegen de algo diferente: el mismo encabezado se usa indirectamente #includevarias veces al compilar un solo .cpparchivo