Witam, czy istnieje jakiś mechanizm w C++ abym mógł zainicjalizować klasę statyczną, w C# istnieje coś takiego jak konstruktor statyczny czy C++ ma swój jakiś odpowiednik? Mam klasę która zawiera jedynie statyczne metody i jedno statyczne pole na którym operują te motody, sęk w tym że muszę zainicjalizować wartość tego pola, pole to to std::map.
0
0
std::map MojaKlasa::MojePole=std::map(...);
0
No dobra, ale chodzi o to żeby do tej mapy już dodać odpowiednie elementy:
mapa["a"] = a;
mapa["b"] = b;
//...
mapa["cos"] = x;
Myślałem żeby zrobić prywatną statyczną metodę Init() i wywołuje ją w każdej funkcji publicznej, funkcja sprawdza czy była już wywoływana jeżeli tak to kończy pracę, a jeżeli nie to inicjalizuje mape, czy to dobre rozwiązanie?
dodanie znacznika <code class="cpp"> - fp
3
Wymaga wsparcia dla C++11:
class Cokolwiek {
public:
static std::map<std::string, int> foo;
};
decltype(Cokolwiek::foo) Cokolwiek::foo = {
{"a", 1},
{"b", 2},
{"c", 3},
};
0
Ktosik123 napisał(a):
Myślałem żeby zrobić prywatną statyczną metodę Init() i wywołuje ją w każdej funkcji publicznej, funkcja sprawdza czy była już wywoływana jeżeli tak to kończy pracę, a jeżeli nie to inicjalizuje mape
Może zamiast definiować wszystkie pola statyczne przerobić tą klasę na singletona albo opakować ją w jakąś inną klasę ? :
class Singleton {
public:
Singleton(const Singleton&) = delete;
Singleton & operator= (const Singleton &) = delete;
static Singleton & get()
{
static Singleton instance;
return instance;
}
int foo1() { return x + 1; }
private:
Singleton()
{
//ctor
}
int x = 6;
};
// (...)
// użycie Singleton::get().foo1();
lub
class MyClass {
public:
MyClass()
{
//ctor
};
int foo1() { return x + 1; }
int foo2() { return x + 2; }
private:
int x = 6;
};
struct StaticMyClass {
static MyClass & get()
{
static MyClass myClass;
return myClass;
}
//(...)
//StaticMyClass::get().foo1();
};