2012-05-10 22 views
8

Qui ci sono un sacco di domande su statico e globale, ma penso che la mia domanda sia un po 'diversa.Condivisione di variabili statiche tra file: namespace vs class

Voglio sapere se esiste un modo per condividere una variabile collocata in uno spazio dei nomi tra i file come possono fare le variabili statiche in una classe.

Per esempio, ho codificato questo:

//Foo.h 
class Foo 
{ 
    public: 
    static int code; 
    static int times_two(int in_); 
}; 

namespace bar 
{ 
    static int kode; 
} 

-

//Foo.cpp 
int Foo::code = 0; 

int Foo::times_two(int in_) 
{ 
    bar::kode++; 
    code++; 
    return 2*in_; 
} 

-

//main.cpp 
int main() 
{ 
    cout << "Foo::code = " << Foo::code << endl; 

    for(int i=2; i < 6; i++) 
    { 
    cout << "2 x " << i << " = " << Foo::times_two(i) << endl; 
    cout << "Foo::code = " << Foo::code << endl; 
    cout << "bar::kode = " << bar::kode << endl; 

    if(i == 3) 
    { 
     bar::kode++; 
    } 
    } 
} 

Tutto ciò che ha prodotto questo per codice e Kode:

Foo::code = 1,2,3,4 
bar::kode = 0,0,1,1 

Ancora una volta, c'è un modo per condividere una variabile collocata in uno spazio dei nomi tra i file come possono fare le variabili statiche in una classe? Il motivo per cui lo chiedo è perché pensavo di essere in grado di proteggermi dalle variabili globali in conflitto usando :: notation, e ho appena scoperto che non potevo. E come ogni programmatore che si rispetti da solo, credo che sto sbagliando.

+1

'static' è probabilmente la parola chiave singola più sovraccarico in C++. Significa qualcosa di diverso in entrambi i contesti. – Flexo

+1

... e in questo caso particolare, esattamente l'opposto di quello che vuoi. –

risposta

19

Sì:

//bar.h 
namespace bar 
{ 
    extern int kode; 
} 

Al di fuori di un class o struct, static ha un significato del tutto diverso. Dà un collegamento interno al simbolo. Pertanto, se dichiari la stessa variabile di static, otterrai effettivamente una copia diversa per tutte le unità di traduzione, non un unico globale.

Si noti che è necessario inizializzare la variabile volta:

//bar.cpp 
namespace bar 
{ 
    int kode = 1337; 
} 
+4

@Morpork: si noti che 'kode' è dichiarato' extern' qui, non 'static'. È importante. –

+0

@John Sì, avevo la sensazione che non ci fosse la possibilità di evitare extern quando sono coinvolti più file. Tranne una variabile statica in una classe, ovviamente. Grazie per le risposte molto veloci, tutto. – Morpork

+2

@Morpork Davvero non capisco perché la gente vuole evitare l'extern ... –

Problemi correlati