2013-03-12 19 views
6

Hi principiante iam in C++ ho classe con metodi statici e non posso accedervi mi genera un erroreC++ simbolo esterno non risolto

1>------ Build started: Project: CPractice, Configuration: Debug Win32 ------ 
1> Source.cpp 
1>Source.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > CPractice::name" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@A) 
1>c:\users\innersoft\documents\visual studio 2012\Projects\CPractice\Debug\CPractice.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

e qui è il mio codice

#include <iostream> 
#include <stdio.h> 
#include <cstdlib> 
#include <string> 

using namespace std; 

class CPractice 
{ 
    public: 
     static void setName(string s) 
     { 
      name = s; 
     } 
     static string getName() 
     { 
      return name; 
     } 
    private: 
     static string name; 
}; 


int main() 
{ 


    CPractice::setName("Name"); 
    cout << "\n" << CPractice::getName(); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

risposta

18
static string name; 

Poiché è static, questa riga solo dichiaraname - è necessario definirla anche. È sufficiente posizionare questo sotto la definizione della classe:

string CPractice::name; 

Se si finisce per spostare la classe per un corrispondente file di intestazione e di attuazione, assicuratevi di inserire questa definizione nel file di implementazione. Dovrebbe essere definito solo in una singola unità di traduzione.

+0

ho pensato che il suo definito giá quando ho dichiarato. Le sue opere, grazie mille –

+1

@SilvioMarijic È un errore comune che le persone hanno. La ragione per cui non è una definizione è di evitare di avere più definizioni. Se fosse una definizione e tu avessi incluso l'intestazione in molti altri file, avresti più definizioni dello stesso membro statico. Ad ogni modo, non dimenticare di dire grazie accettando la risposta che ti ha aiutato di più. –

1

Penso che stiate provando a compilare con gcc, quando dovreste compilare con g++. Vedi What is the difference between g++ and gcc? per ulteriori informazioni.

È inoltre necessario aggiungere string CPractice::name; sotto la definizione della classe.

1

Hai solo dichiarato name nella classe, variabili statiche devono essere definiti in questo modo al di fuori della classe:

string CPractice::name ="hello" ; 
1

Poiché il nome è una statica membro datisi dovrebbe inizializzare :) e non contano sul costruttore relativo all'istanza predefinito.

Aggiungere questo, dopo le definizioni di classe (sì, lo so la sua confusione dal momento che il vostro membro è un privato, ma questa è solo una di inizializzazione):

string CPractice::name; 
Problemi correlati