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?

Author: ネロク, 2010-04-09

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.

 148
Author: squelart,
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");
 12
Author: Michael Burr,
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;
}
 9
Author: GManNickG,
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.

 1
Author: Behnam Dezfouli,
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.

 -2
Author: yjjjnls,
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