mam klasę
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Gdzie jest najlepsze miejsce do zainicjowania łańcucha s
w pliku źródłowym?
c++
static
initialization
constants
Tomasz
źródło
źródło
i
musi być zdefiniowany w cpp. §9.4.2 / 4 Jeśli statyczny element członkowski danych jest typu consti
, że należałoby je zdefiniować tylko wtedy, gdyby zostało użyte gdzie indziej niż w całkowitych wyrażeniach stałych, prawda? W tym przypadku nie możesz powiedzieć, że wystąpił błąd, ponieważ nie ma wystarczającego kontekstu, aby być pewnym - lub mówiąc ściślej, powyższy przykład jest poprawny, jeśli nie ma innego kodu. Teraz doceniam Twój komentarz (+1), sam wciąż się uczę! Spróbuję więc wyjaśnić ten punkt w odpowiedzi, daj mi znać, jeśli będzie lepiej ...int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
Zauważ, że C ++ 11 umożliwia wywoływanie funkcji „constexpr”:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Elementy statyczne należy zainicjować w jednostce translacji .cpp w zakresie pliku lub w odpowiedniej przestrzeni nazw:
const string foo::s( "my foo");
źródło
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; }
źródło
Od C ++ 17 specyfikator wbudowany ma również zastosowanie do zmiennych. Możesz teraz zdefiniować statyczne zmienne składowe w definicji klasy:
#include <string> class foo { public: foo(); foo( int ); private: inline static const std::string s { "foo" }; };
źródło
Tylko wartości całkowite (np.
static const int ARRAYSIZE
) Są inicjowane w pliku nagłówkowym, ponieważ są one zwykle używane w nagłówku klasy do definiowania czegoś takiego jak rozmiar tablicy. Wartości niecałkowite są inicjowane w pliku implementacji.źródło