2012-03-23 20 views

Respuesta

18

No tiene nada que ver con el lugar que ha definido la función, es que no ha definido la variable miembro estática, sólo declaró. Debe colocar su definición fuera de la clase, p.

int TT::i; 
+1

+1 Eliminado mi respuesta porque me di cuenta de que lo has enganchado. – Lou

+0

funciona, gracias – user956159

2

Las variables estáticas se guardan en una parte diferente de la memoria que cualquier instancia de una clase. Esto se debe a que no son PARTE de una instancia de ninguna clase.

El siguiente código se compila porque nunca se llama a la función t.

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 


    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    //t->t(); 
    return 0; 
} 

Sin embargo, este código no complie, porque t se llama

class TT 
{ 
private: 
    static int i; 
public: 
    void t() 
    { 
     i=0; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    qWarning() << "hi"; 
    TT * t = new TT(); 
    t->t(); 
    return 0; 
} 

Se le permite tener referencias indefinidas que no utiliza en C++ (y C para el caso). Por alguna razón, no estoy seguro, el compilador parece pensar que este código hace referencia a i, cuando el material que está arriba no lo hace referencia hasta que se lo llama (¿alguna idea de por qué?)

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

//int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 

ejemplo funcional, con la estática definida:

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

int TT::i = 0; 

void TT::t(){ 
    i=0; 
} 
+2

El error de "referencia indefinida" que recibía es un error de enlazador y no de compilación. –

+0

Absolutamente correcto. Tengo el mal hábito de llamar cualquier cosa que aparece en mi consola "Compile Output" un error de compilación. –

+0

¡Esta es una respuesta mucho más completa! :RE – kotoko

3

referencia indefinida a `TT :: i'

es porque usted no ha definido el miembro de datos estático fuera de clase . Todos los miembros de datos estáticos deben definirse fuera de clase antes de usarlos.

class TT 
{ 
private: 
    static int i; 
public: 
    void t(); 
}; 

void TT::t() 
{ 
    i=0; 
} 
int TT::i=0; // define it outside the class. and if possible initialize 
Cuestiones relacionadas