2013-03-05 11 views
15

Szukałem się sposoby zainicjowania mapę statycznych w C++ i znaleźć ten kod:dlaczego "statyczne" nie mogą być używane podczas definiowania (w przeciwieństwie do deklarowania) statycznego elementu danych "?

struct A{ 
static map<int,int> create_map() 
    { 
     map<int,int> m; 
     m[1] = 2; 
     m[3] = 4; 
     m[5] = 6; 
     return m; 
    } 
static const map<int,int> myMap; 

}; 

const map<int,int> A:: myMap = A::create_map(); 

Jednak jeśli zmienię ostatnią linię do

const static map<int,int> A:: myMap = A::create_map(); 

Compiler skarg: „statyczne” nie może być wykorzystywane przy definiowaniu (w przeciwieństwie do deklarowania) statycznego członka danych”?

zastanawiam się, dlaczego? Co znajduje się w logikę lub rozumowanie za tym stoi?

Odpowiedz

15
static int a = 0; // grandfathered and still useful, provides static *LINKAGE* 
        // and static STORAGE DURATION 
static int X::a = 0; // confusing and illegal, is it static LINKAGE 
        // or static STORAGE DURATION 
        // or static MEMBERSHIP? 

static ma już znaczenie (w języku C), gdy jest używane w definicji zmiennej. Byłoby bardzo zaskakujące dla programistów C uczących się języka C++, aby odkryć, że znaczenie było czasami zmieniane, ale nie zawsze.

Nowe znaczenie (członkostwo statyczne) jest aktywne tylko w definicji klasy (gdzie C nie zezwala na wprowadzenie słowa kluczowego static).

3

To nie różni się od

struct A 
{ 
    static int x; 
} 

int A::x;   //legal 
static int A::x; //illegal 

Wszystko inne jest po prostu więcej słów kluczowych rzucone na tym minimalnym, koncepcyjnie identyczne, np. Człon członkowski static można zadeklarować tylko jako static w definicji klasy.

const map<int,int> A:: myMap = A::create_map(); 

poza klasą jest tylko definicja członka A::myMapstatic. Dodatkowy static nie ma sensu.

Przyczyną tego jest prawdopodobnie uniknięcie zamieszania - zmienna wolna static jest rodzajem zmiennej "prywatnej" (do jednostki tłumaczeniowej). Członek static jest odwrotny.

2

Zgłoszenie członka klasy static oznacza, że ​​jest on dzielony między wszystkie obiekty tej klasy.

Dodanie static do definicji zmiennej poza klasą oznacza, że ​​ta zmienna ma zasięg pliku i nie jest widoczna poza tym plikiem.

czy byłoby wolno

const static map<int,int> A:: myMap = A::create_map(); 

oznaczałoby to, że masz statyczną zmienną składową, która nie jest widoczna na zewnątrz tego pliku. To po prostu nie ma sensu.

+0

inaczej oznaczałoby to statyczne członkostwo, które byłoby niespójne. –

+0

@BenVoigt mało prawdopodobne, statyczne dla członkostwa jest zbędne - nie można w ten sposób definiować niestatycznych członków. – Slava

+0

@Slava: Absolutnie prawdziwe, byłoby niespójne i zbędne, więc dwa dobre powody, by to zabronić. Ale nie sądzę, że pytanie dotyczyło statycznego powiązania. –

Powiązane problemy