2011-01-15 11 views
5

Tengo una variable estática en la clase. Inicializo eso en el alcance global, funciona bien.Inicialización de variable de clase estática dentro de la principal

Pero Cuando trato de inicializar en el vinculador principal arroja un error. Por qué es así.

class Myclass{ 

    static int iCount; 
} ; 

int main(){ 

    int Myclass::iCount=1; 

} 

Y en el ámbito global por la que tienen que especificar la variable de tipo como

int Myclass::iCount=1; 

como en mi clase me definig iCuenta como tipo entero por qué no.

Myclass::iCount =1 ; in //Global scope 
+0

@goreSplatter: 'Myclass :: iCount' no es público, fallaría. – peoro

+0

@goreSplatter: Lo que dijo @peoro, pero incluso si fuera público, sería una * asignación * no y * inicialización * – Clifford

+0

@ peoro: * la inicialización * de los miembros de datos estáticos privados no falla !! otros accesos, como * assignment *, fallarán. – Nawaz

Respuesta

5

La sección 9.4.2 $/7 del estándar de C++ dice,

miembros de datos estáticos se inicializan y destruyeron exactamente como no locales objetos (3.6.2, 3.6.3).

Nota las frases "iniciada" y "exactamente igual que los objetos no locales". Espero que eso explique por qué no puedes hacer eso.

De hecho, los miembros estáticos son más como objetos globales a los que se accede a través de Myclass::iCount. Por lo tanto, usted tiene que inicializar ellos en el ámbito global (el mismo ámbito en el que se define la clase), así:

class Myclass{ 

    static int iCount; 
} ; 
int Myclass::iCount=1; 

int main(){ 
    /*** use Myclass::iCount here ****/ 
} 

tema:

How do static member variables affect object size?

3

Porque la sintaxis de C++ no permite esto. Necesita crear una instancia de su variable estática fuera del alcance de alguna función.

Además de olvidar un punto y coma ; después de su clase que termina el corchete.

3

este es el C++ correcto. Fuera de una función, en un archivo cpp. la inicialización se realiza al comienzo/lanzamiento del ejecutable. (incluso antes de llamar a main());

//main.h 

class Myclass{ 

    static int iCount; 
}; // and don't forget this ";" after a class declaration 


//main.cpp 

int Myclass::iCount=1; 

int main(){ 



} 
1

La inicialización estática se produce antes de principal es invocado por la inicialización en tiempo de ejecución.

No se permite colocarlo dentro de una función porque es allí donde se declaran con ámbito local objetos. Sería confuso y ambiguo permitir eso.

2

De C++ estándar (§8.5/10):

An initializer for a static member is in the scope of the member’s class.

clase Myclass tiene un alcance global y que ha intentado inicializar el miembro estático en el alcance más reducido - de la función main.

Cuestiones relacionadas