2010-05-09 18 views
6

Tengo una clase que debe declararse globalmente desde main() y se accede desde otras clases declaradas en el programa, ¿cómo hago eso?C++: ¿Declarar una clase global y acceder a ella desde otras clases?

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

Supongo que el patrón de diseño de singelton es un buen punto para comenzar con http://stackoverflow.com/questions/1008019/c-singleton-design-pattern –

+3

@Artem: [Singletons: Cómo resolver problemas que nunca supo que nunca tenía desde 1995] (http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-younever-had-since-1995/) –

+0

@Artem - para enfatizar lo que @ gf dice - ¡no hagas esto! El estado global hace que el código sea imposible de componer y esté estrechamente acoplado. Esto es malo, entre otras razones, porque hace que sea virtualmente imposible de probar. Además, casi todas las implementaciones de singleton que he visto no eran seguras para hilos de ninguna manera sutil y desagradable que no notara hasta que su código se ejecuta en una CPU con un modelo de memoria débil. – Stewart

Respuesta

7

Es probable que realmente no quiere hacer esto, pero si es necesario - en el archivo que contiene principal:

#include "A.h" 
A a; 

int main() { 
... 
} 

y luego en los archivos que necesitan acceder al mundial:

#include "A.h" 
extern A a; 

Deberá poner la declaración de A en el archivo Ah header para que esto funcione.

+0

Gracias, ¿los externs serán visibles desde dentro de las otras clases? – Regof

+1

@Regof Si algo se declara en el alcance del archivo (para usar un término antiguo) y no está etiquetado como estático, se puede acceder desde _anywhere_. Es por eso que la creación de tales objetos es una mala idea. Nunca crearía tales cosas en mi propio código, y sugiero que tampoco. Pero el lenguaje, como he indicado, lo permite. –

+0

déjame probarlo ... eso es solo para un experimento, solo para jugar, no te preocupes :-) – Regof

1

En C++ declarar una instancia global de una clase es un no-no.

En su lugar, debe utilizar el patrón singleton, que le brinda una instancia única de su objeto accesible desde toda la aplicación.

Puede encontrar mucha literatura sobre la implementación de singleton en C++, pero wikipedia es un buen lugar para comenzar.

Thread safe singleton pattern implementation ya se ha discutido en stackoverflow.

+3

No se puede usar global, ¿entonces usar singleton? ¿Qué crees que es un singleton? Es global. Simplemente use un sistema global y elimine toda la basura de instancia única que no necesita. – GManNickG

Cuestiones relacionadas