C++ gdzie zainicjować statyczny const
Mam klasę
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Gdzie najlepiej zainicjować łańcuch s
w pliku źródłowym?
5 answers
Anywhere in one compilation unit (Zwykle a .plik cpp) zrobiłby:
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;
(*) zgodnie ze standardami musisz zdefiniować i
poza definicją klasy (jak j
is), jeśli jest ona używana w kodzie innym niż tylko całkowe wyrażenia stałe. Zobacz komentarz Davida poniżej po szczegóły.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-09 12:18:20
Statyczne elementy muszą być zainicjalizowane w .Jednostka tłumaczenia cpp w obszarze pliku lub w odpowiedniej przestrzeni nazw:
const string foo::s( "my foo");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-09 07:11:04
W jednostce tłumaczeniowej w tej samej przestrzeni nazw, zwykle u góry:
// 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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-09 06:44:05
Tylko wartości całkowe (np. static const int ARRAYSIZE
) są inicjowane w pliku nagłówkowym, ponieważ są one zwykle używane w nagłówku klasy do zdefiniowania czegoś takiego jak rozmiar tablicy. Nieintegralne wartości są inicjowane w pliku implementacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-31 01:23:49
const string foo::s( "my foo");
I powinien być zainicjowany w pliku źródłowym, w przeciwnym razie nie zadziała, gdy wywołasz go w przypadku testowym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 08:46:57