2013-05-09 15 views
5

Ho cercato su Internet e ho scoperto che alcune persone hanno affermato che la funzione membro non statico può accedere alla funzione o ai dati dei membri statici. Quindi ho scritto un programma per verificarlo.La funzione membro non statico può accedere alla funzione o ai dati dei membri statici?

#include <iostream> 
class test 
{ 
public: 
    static int a; 
    void printa() 
    { 
     std::cout<<a; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    test m; 
    m.printa(); 

    return 0; 
} 

Il codice genera errori di linker!

Undefined symbols for architecture x86_64: 
    "test::a", referenced from: 
     test::printa() in main.o 
+0

possibile duplicato del [errore di linker quando si utilizzano i membri statici] (http: // StackOverflow.com/domande/8612206/static-membri linker-error-quando-con-) – AnT

+0

Ecco simile problema e la sua soluzione è [qui] [1] [1]: http: // StackOverflow .com/questions/8034568/undefined-symbols-for-architecture-x86-64-which-architecture-should-i-use – Uahmed

+0

possibile duplicato di [Inizializzazione di membri statici privati] (http://stackoverflow.com/questions/185844/initializing-private-static-members) –

risposta

7

Dichiarazione di una variabile come static all'interno di una classe è, così, solo una dichiarazione.

È necessario definire la variabile come pure, il che significa che l'aggiunta di questa linea in una singola unità di compilazione:

int test::a = 0;

Per essere più precisi: un'unità di compilazione è fondamentalmente un file cpp. Si dovrebbe non mettere quella riga direttamente in un file di intestazione, altrimenti si otterrà l'errore opposto: "definizione multipla di ...".

Questo sarà anche, come avete indovinato, l'inizializzazione della variabile su 0 una volta avviato il programma.

Se si inserisce questa riga nella dichiarazione della classe, verrà risolto il problema (in questa situazione specifica: ricordare di non scrivere questo in un file di intestazione).

+2

vale la pena aggiungere "non inserirlo in un file di intestazione", poiché non tutti sanno cosa significa "unità di compilazione". – Elazar

+1

Buon punto. Lo aggiungerò alla mia risposta. – Nbr44

0

È necessario definire l'istanza del membro dati statici. Aggiungere una linea ...

int test::a; 

... sopra main(), o sotto main() ... praticamente ovunque direttamente nello stesso ambito spazio dei nomi come class test e dopo class test 's definizione.

+0

non importa dove verrà definito. – Elazar

+0

@Elazar: questo è un argomento ciclico, perché se provi a metterlo da qualche parte illegale non sarà definito ;-P. Il mio suggerimento di sopra 'main' era quello di garantire che una definizione non fosse * tentata * all'interno di' main() '(che costituirebbe un'altra dichiarazione), né prima o all'interno di' class test' .... –

+0

@elazar che non è completamente vero. La dichiarazione della classe di cui è membro deve essere visibile. – jrok

2

Ecco perché hai solo dichiarato test::a, non definita è:

#include <iostream> 
class test 
{ 
    ... 
}; 

int test::a = 1; //Needs a definition! 
1

si è dichiarato solo il membro dei dati static. Non l'hai definito.

Per definirlo è necessario fare qualcosa come int test:: a;.

Vedi this membri troppo

non statici sono autorizzati ad accedere ai membri di dati statici. Il contrario non è consentito perché i membri statici non appartengono a nessun oggetto

1

quando si crea un membro statico in una classe, quindi è necessario definirlo al di fuori della classe. ti sei appena perso per definirlo, questo è il motivo per cui hai un errore di linker.

class Animal 
{ 
    static int leg; 
    int Data; 
    public: 
     int Display(); 

}; 

int Animal::leg=20; // Need to define the static member 

int Animal::Display() 
    { 
     cout<<"A static value :"<<leg<<endl; 
     leg =40; 
     cout<<"A static value :"<<leg<<endl; 
    } 


int main(int argc, char** argv) 
{ 
Animal a; 
a.Display(); 
return 0; 
} 

Per ulteriori dettagli si veda questo blog:
http://www.aticleworld.com/

Problemi correlati