2010-05-09 12 views
6

Ho una classe che dovrebbe essere dichiarata globalmente da main() e accessibile da altre classi dichiarate nel programma, come faccio?C++: dichiarare una classe globale e accedervi da altre classi?

class A{ 
    int i; 
    int value(){ return i;} 
}; 

class B{ 
    global A a; //or extern?? 
    int calc(){ 
     return a.value()+10; 
    } 
} 

main(){ 
    global A a; 
    B b; 
    cout<<b.calc(); 
} 
+0

Immagino che il pattern di progettazione di singelton sia un buon punto per iniziare con http://stackoverflow.com/questions/1008019/c-singleton-design-pattern –

+3

@Artem: [Singletons: risolvere i problemi che non conoscevi non hai mai dal 1995] (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/) –

+0

@Artem - per rimarcare nuovamente cosa @ dice gf - non farlo! Lo stato globale rende il codice impossibile da comporre e strettamente accoppiato. Questo è negativo, tra le altre ragioni, perché rende praticamente impossibile testare. Inoltre, quasi tutte le implementazioni singleton che ho visto non erano thread safe in un modo sottile e sgradevole che non si nota finché il codice non viene eseguito su una CPU con un modello di memoria debole. – Stewart

risposta

7

Probabilmente in realtà non si vuole fare questo, ma se si deve - nel file che contiene principale:

#include "A.h" 
A a; 

int main() { 
... 
} 

e poi nei file che hanno bisogno di accedere al globale:

#include "A.h" 
extern A a; 

Sarà necessario inserire la dichiarazione di A nel file di intestazione Ah affinché funzioni.

+0

Grazie, gli esterni saranno visibili dall'interno delle altre classi? – Regof

+1

@Regof Se qualcosa viene dichiarato nell'ambito del file (per utilizzare un termine precedente) e non è contrassegnato come statico, è possibile accedervi da _anywhere_. Ecco perché creare tali oggetti è una cattiva idea. Non creerei mai cose del genere nel mio codice, e suggerisco di non farlo neanche io. Ma la lingua, come ho indicato, lo consente. –

+0

fammi provare ... questo è solo per un esperimento, basta giocare, non ti preoccupare :-) – Regof

1

In C++ dichiarare un'istanza globale di una classe è un no-no.

Si dovrebbe invece utilizzare il modello di singleton, che fornisce una singola istanza dell'oggetto accessibile dall'intera applicazione.

È possibile trovare molta letteratura sull'implementazione di singleton C++, ma wikipedia è un buon punto di partenza.

Thread safe singleton pattern implementation è già stato discusso su stackoverflow.

+3

Non è possibile utilizzare globale, quindi utilizzare singleton? Cosa ne pensi di un singleton? È globale. Basta usare un globale e abbandonare tutta la merda a istanza singola di cui non hai bisogno. – GManNickG

Problemi correlati