2013-03-12 16 views
6

Hi iam początkujący w C++ mam klasy z metody statyczne i nie mogę do nich dostęp to wyrzuca mi błądC++ nierozwiązanych zewnętrznych symbolu

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 ========== 

i tu jest mój kod

#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; 
} 

Odpowiedz

18
static string name; 

Ponieważ jest to static, ta linia tylko deklarujename - musisz to również zdefiniować. Wystarczy umieścić ten poniżej definicji klasy:

string CPractice::name; 

Jeśli kończy się przesuwając klasę do odpowiedniego nagłówka i wdrażania pliku, upewnij się umieścić tę definicję w pliku implementacji. Powinien być zdefiniowany tylko w jednej jednostce tłumaczeniowej.

+0

myślałem, że jego definicją allready kiedy ogłosił go. Jego prace, bardzo dziękuję –

+1

@SilvioMarijic To powszechny błąd, który ludzie mają. Powodem, dla którego nie jest to definicja, jest unikanie wielu definicji. Gdyby była to definicja, a ty umieściłeś nagłówek w wielu innych plikach, miałbyś wiele definicji tego samego statycznego elementu. W każdym razie, nie zapomnij podziękować, akceptując odpowiedź, która pomogła ci najbardziej. –

1

Myślę, że próbujesz skompilować się z gcc, kiedy powinieneś kompilować się z g++. Więcej informacji na ten temat można znaleźć w artykule What is the difference between g++ and gcc?.

Musisz również dodać string CPractice::name; poniżej definicji klasy.

1

Państwo tylko uznane name w klasie, zmienne statyczne muszą być definiowane podobnie jak na zewnątrz klasy:

string CPractice::name ="hello" ; 
1

Od nazwy jest statyczne członek dane należy go zainicjować :) i nie liczą na konstruktorze powiązanym z domyślną instancją.

Dodaj to po definicji klasy (tak, wiem, że jego mylące ponieważ twój członek jest prywatny, ale jest to tylko inicjalizacji):

string CPractice::name; 
Powiązane problemy