10

Mam klasę ze statycznym elementem. Zostanie to zainicjowane przy użyciu prywatnej funkcji statycznej tej samej klasy.Dostęp do prywatnych funkcji statycznych podczas inicjowania elementu statycznego.

#include <iostream> 
#include <string> 

class A 
{ 
public: 
    static std::string const s; 

private: 
    static std::string make() 
    { 
     return "S"; 
    } 
}; 

std::string const A::s = A::make(); 

int main() 
{ 
    std::cout << A::s << std::endl; 
    // std::cout << A::make() << std::endl; // <-- Does not work 
    return 0; 
} 

Moje pytanie brzmi: Z powodu której zasady jest to dozwolone? Oczywiście część z komentarzami nie działa, ponieważ nie mam dostępu do prywatnej funkcji spoza klasy. Dlaczego więc inicjowanie prywatnego statycznego elementu podczas uruchamiania specjalnego przypadku? (A na marginesie: jaka jest intencja tej reguły?) Czy to w tym dokładnie przypadku?)

Jestem świadomy innych mechanizmów inicjowania statycznego elementu (jak tutaj: Initializing private static members). Ale w moim przypadku członek jest const, więc o ile wiem, jedynym sposobem na jego ustawienie jest bezpośrednia inicjalizacja w miejscu definicji.

Odpowiedz

8

Ponieważ inicjalizacja statycznego elementu danych jest uważana za część charakteryzacji klasy, nawet jeśli statyczny element danych jest zdefiniowany w obszarze nazw (poza definicją klasy).

od standardu, $9.2.3.2/2 Static data members [class.static.data]:

(kopalnia nacisk)

Wyrażenie inicjatora w definicji statycznego elementu danych znajduje się w zakresie tej klasy ([basic.scope. klasa]).

[przykład:

class process { 
    static process* run_chain; 
    static process* running; 
}; 

process* process::running = get_main(); 
process* process::run_chain = running; 

Statyczny element danych run_chain klasy process definiuje globalnego zakresie; oznaczenie process::run_chain określa, że ​​członek run_chain jest członkiem klasy process oraz w zakresie klasy process. W definicji statycznego elementu danych wyrażenie inicjalizacyjne odnosi się do statycznego elementu danych running klasy process. - przykład końcowy]

+1

Masz rację co do const. Edytował pytanie. Dzięki. –

+1

Myślę, że byłby jaśniejszy: "Inicjalizacja statycznego elementu danych jest uważana za część charakteryzacji klasy, nawet jeśli statyczny element danych jest zdefiniowany w zakresie przestrzeni nazw (poza definicją klasy)." (Użyłem "charakteryzacji", ponieważ "definicja klasy" ma bardzo formalne znaczenie w standardzie C++.) –

+0

@MartinBonner Fine. – songyuanyao