2011-04-04 26 views
7

Estoy trabajando con código que tiene una variable estática global (que es un objeto) y necesito acceder a ella desde otra clase. Siempre he evitado las variables/funciones globales en general, así que en esta situación no estoy seguro de cómo hacerlo correctamente.Acceder a una variable estática global de otra clase

Para aclarar mi comprensión de las cosas, en una variable estática global tiene un enlace interno, lo que significa que cualquier archivo fuente que incluya este encabezado en particular obtendrá su propia copia de la variable?

EDITAR: Lo que he intentado hasta ahora es hacer una función que devuelva la dirección de la variable. Desafortunadamente, eso no parece estar funcionando.

// names were changed but the code is as follows. 
// There is of course other code in the header 
namespace SomeNameSpace 
{ 
    static anArray<someObject> variable; 
} 

NOTA: I no se puede cambiar el código en la cabecera, donde se declara la variable estática global. I puede agregar funciones pero debería intentar evitarlo si puedo.

+1

¿Puede mostrar cómo se declara el global? –

+0

¿Es miembro de una clase? Miembro público? –

+0

No es miembro de ninguna clase. @Timo: consulte la última edición – Samaursa

Respuesta

2

Puede decidir sobre una versión maestra del contenedor en un archivo .cpp, y tener una función devolver una referencia o un puntero a eso. Entonces no te molestes con las otras copias.

Wrapper.h

anArray<someObject>& Objects(); 

Wrapper.cpp

#include "someHeader.h" 

anArray<someObject>& Objects() 
{ return SomeNameSpace::variable; } 

O hacer que el valor de retorno de una referencia constante, si no tiene intención de cambiar los valores.

0

Si el archivo de cabecera tiene la variable declarada como static int a; entonces sí, cada unidad de traducción que incluye esa cabecera conseguirá es propia copia de la variable y el problema a asegura.

Si se declara como extern int a, la variable a se comparte en todas las unidades de traducción donde se incluye, y se define en algún otro archivo.

0

Si es declarado como esto:

MyClass myObj; 

entonces cada .cpp en archivos que de alguna manera incluye la cabecera, posiblemente a través de otras cabeceras, recibirá una copia, y puesto que todos ellos tendrán el mismo nombre el enlazador se quejará

Sin embargo, si se declara así:

extern MyClass myObj; 

entonces se acaba de declarar y que no tendrán ningún problema para incluir la cabecera en varios archivos, sin embargo, tiene que ser definido en un archivo .cpp.

+0

Se declara así: 'static anArray variable;' – Samaursa

1

Cuando se declara en la cabecera del archivo que

static int g_foo; 

e incluyen el archivo de cabecera en varios archivos .cpp, se obtiene múltiples instancias uno para cada archivo .cpp que incluye la cabecera. Estas instancias no interfieren en absoluto. Usted no puede comunicar entre las unidades de compilación con estas variables. Cada instancia es local a la unidad de compilación.

Cuando se declara

class Foo 
{ 
    public: 
     static int bar; 
}; 

, entonces obtendrá un miembro estática que debe ser definido en un archivo .cpp como int Foo::bar; La accesibilidad es definir como público en este caso.

+0

Eso lo entiendo, pero ¿cómo hago para acceder al primero (es decir, 'static int g_foo') desde múltiples archivos' .cpp'? – Samaursa

0

¿Quién está creando instancias de un objeto? ¿Qué sucede si se accede al objeto sin que se lo cree?

¿No debería ponerlo en una función que lo instanciará?

...

anArray<someObject> aStaticVariable() 
{ 
    static anArray<someObject> myStaticVariable; 
    return myStaticVariable; 
} 

EDIT: aClass.h

static Object myObj; 

aClass.cpp

aClass(const &Params params): 
myObj(params.x) 
{ 
    .... 
} 

bClass.cpp

extern Object aClass::myObj; //not necessarily initialised 
bClass{ 
    ... 
    myObj.getSomething(); //problem maybes 
    ... 
} 
+0

Bueno, dado que es una variable automática, supongo que se creará una instancia cuando comience el programa. – Samaursa

+0

@Samaursa Sí, se creará una instancia cuando intente usarlo, pero no si es externo a la unidad de compilación. Por ejemplo, si usa 'extern static anArray myStaticVariable;' y no crea una instancia de la clase contenedora, entonces si la usa en una clase separada 'myStaticVariable.push (a);' y no se ha inicializado entonces estás en problemas. Puede inicializarse pero el orden relativo de inicialización de objetos estáticos no locales definidos en diferentes unidades de traducción no está definido. – Dennis

+0

El código no tiene 'extern'. Además, el orden relativo de inicialización solo importará si estoy tratando de usar la matriz en la hora de inicio del programa, ¿no? Si es así, entonces eso no es un problema ya que estoy accediendo a él en tiempo de ejecución mientras el programa se está ejecutando. Si no es así (es decir, puede que no se inicialice incluso en tiempo de ejecución), corrija mi comprensión de cómo funcionan las variables estáticas en este caso. – Samaursa

Cuestiones relacionadas