2010-01-08 8 views
13

Tengo una variable que me gustaría usar en todas mis clases sin necesidad de pasarla al constructor de la clase cada vez que me gustaría usarla. ¿Cómo podría lograr esto en C++?Cómo declarar una variable global que podría usarse en todo el programa

Gracias.

+0

Independientemente de si se utiliza un 'Singleton', uno de los problemas sigue siendo que ahora tiene una orden de inicialización potencial'/destrucción fiasco' a punto de ocurrir ... incluso en un solo programa de roscado. Dicho esto, sé que a veces es mucho más fácil, especialmente cuando deseas promover el desacoplamiento. –

Respuesta

19
global.h 
extern int myVar; 

global.cpp 
#include "global.h" 
int myVar = 0; // initialize 

class1.cpp 
#include "global.h" 
... 

class2.cpp 
#include "global.h" 
... 

class3.cpp 
#include "global.h" 
... 

MyVar será conocido y utilizable en cada módulo como una variable global. No es necesario que tenga global.cpp. Puedes inicializar myVar en cualquiera de los .cpp de clase, pero creo que esto es más limpio para programas más grandes.

2

Sólo se declaran fuera de la clase:

Archivo de cabecera:

extern int x; 

class A { 
    int z; 
    public: 
    A() : z(x++) {} 
}; 

Un archivo de origen:

int x = 0; 
+0

¿dónde debería ponerlo si uso un encabezado diferente para cada clase y quiero usarlo en todas las clases? – trrrrrrm

+0

tiene que definirlo en un archivo .cpp. Los "encabezados" (no importa si están en sus respectivas .cpp en su lugar) deben contener la palabra clave 'extern' para ese nombre de variable –

+0

La mayoría de los compiladores admiten __declspec (selectany) int x = 0; en el encabezado –

0

declarar la variable como extern en una cabecera común.

Defínalo en cualquier archivo de origen.

1

palabra clave extern

//file1.cpp 

int x = 0; 

//file1 continues and ends. 


//file2.cpp 

extern int x; //this gets tied into file1.cpp's x at link time. 

//file2.cpp goes on and ends 
0

si desea declarar en diferentes archivos de cabecera/cpp, simplemente declaran que extern exterior de otros archivos

//file1.c 
int x=1; 
int f(){} 
//file2.c 
extern int x; 
0
// L.hpp 
struct L { static int a; }; 

// L.cpp 
int L::a(0); 
3

Aunque me gustaría evitar variables globales como la peste, ya que nuestro software no puede ser multiproceso de manera efectiva debido a la gran dependencia de las variables globales, tengo algunas sugerencias:

Usa un Singleton. Le permitirá mantener limpio el código y el acceso. Parte del problema con una variable global es que no sabes qué código lo ha modificado. Puede establecer el valor de global en alguna parte de su función confiando en la esperanza de que nadie más lo cambie, pero funcione sus llamadas de código, fooA, lo cambie y ahora su código esté a) roto, yb) difícil de depurar.

Si tiene que usar una variable global sin tocar el patrón singleton, mire la respuesta de fupsduck.

4

Si no va a utilizar el patrón Singleton como sugiere Lyndsey, al menos use una función global (dentro de un espacio de nombres) para acceder a la variable. Esto le dará una mayor flexibilidad en la forma de administrar esa entidad global.

// mymodule.h 
namespace mynamespace // prevents polluting the global namespace 
{ 
    extern int getGlobalVariable(); 
} 

// mymodule.cpp 
namespace mynamespace 
{ 
    int myGlobalVariable = 42; 

    int getGlobalVariable() 
    { 
     return myGlobalVariable; 
    } 
} 
+0

Sugiero crear una función setGlobalVariable (int newValue) para que al menos se pueda agregar el registro para rastrear los cambios ... –

Cuestiones relacionadas