Konstruktor statyczny w C++

0

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
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},
};

http://ideone.com/VMVmLN

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();
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1