C ++ onde inicializar const estático

Eu tenho uma aula

class foo { public: foo(); foo( int ); private: static const string s; }; 

Onde é o melhor lugar para inicializar a string s no arquivo de origem?

Em qualquer lugar em uma unidade de compilation (normalmente um arquivo .cpp) faria:

foo.h

 class foo { static const string s; // Can never be initialized here. static const char* cs; // Same with C strings. static const int i = 3; // Integral types can be initialized here (*)... static const int j; // ... OR in cpp. }; 

foo.cpp

 #include "foo.h" const string foo::s = "foo string"; const char* foo::cs = "foo C string"; // No definition for i. (*) const int foo::j = 4; 

(*) De acordo com os padrões, você deve definir i fora da definição de class (como j é) se for usada em código diferente de expressões constantes integrais. Veja o comentário de David abaixo para detalhes.

Os membros estáticos precisam ser inicializados em uma unidade de tradução .cpp no ​​escopo do arquivo ou no namespace apropriado:

 const string foo::s( "my foo"); 

Em uma unidade de tradução dentro do mesmo namespace, geralmente no topo:

 // foo.h struct foo { static const std::string s; }; // foo.cpp const std::string foo::s = "thingadongdong"; // this is where it lives // bar.h namespace baz { struct bar { static const float f; }; } // bar.cpp namespace baz { const float bar::f = 3.1415926535; } 

Somente valores integrais (por exemplo, static const int ARRAYSIZE ) são inicializados no arquivo de header porque são geralmente usados ​​no header da class para definir algo como o tamanho de uma matriz. Valores não integrais são inicializados no arquivo de implementação.

 const string foo::s( "my foo"); 

E deve ser inicializado no arquivo de origem, caso contrário, ocorrerá um erro ao invocá-lo no caso de teste.