2008-10-12 30 views
99

Bardzo prostu umieścić:Nierozwiązane symbol zewnętrzny na statycznych członków klasy

Mam klasy, który składa się głównie z członków statycznych publicznych, więc można grupować podobne funkcje razem, że nadal muszą być wywoływane z innych klas/funkcji.

W każdym razie, zdefiniowałem dwie statyczne niepodpisane zmienne char w zakresie publicznym mojej klasy, kiedy próbuję zmodyfikować te wartości w konstruktorze tej samej klasy, podczas kompilacji otrzymuję błąd "nierozwiązanego symbolu zewnętrznego".

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

test::test() { 
    X = 1; 
    Y = 2; 
} 

Jestem nowy w C++, więc idź łatwo. Dlaczego nie mogę tego zrobić?

Odpowiedz

112

zapomniałeś dodać definicje dopasować swoje deklaracje X i Y

unsigned char test::X; 
unsigned char test::Y; 

gdzieś. Może chcesz się również zainicjować należące statycznie

unsigned char test::X = 4; 

i znów to zrobić w definicji (zwykle w pliku CXX) nie w deklaracji (co jest często w pliku .h)

+1

Jeśli piszesz tylko nagłówka biblioteki, można użyć tej techniki, aby uniknąć pliku cpp: http://stackoverflow.com/questions/11709859/how-to-have-static -data-members-in-a-header-only-library – ShitalShah

54

Statyczne deklaracje członków danych w deklaracji klasy nie są ich definicją. Aby je zdefiniować, należy to zrobić w pliku .CPP, aby uniknąć powielania symboli.

Jedyne dane, które można zadeklarować i zdefiniować, są stałymi stałymi statycznymi. (Wartości enums mogą być używane jako wartości stałych, jak również)

Możecie chcą przepisać kod jako:

class test { 
public: 
    const static unsigned char X = 1; 
    const static unsigned char Y = 2; 
    ... 
    test(); 
}; 

test::test() { 
} 

Jeśli chcesz mieć możliwość modyfikowania ci zmiennych statycznych (innymi słowy, gdy niewłaściwe jest zadeklarować je jako const), można oddzielić Ci kod pomiędzy .H i .CPP w następujący sposób:

.H:

class test { 
public: 

    static unsigned char X; 
    static unsigned char Y; 

    ... 

    test(); 
}; 

.cpp:

unsigned char test::X = 1; 
unsigned char test::Y = 2; 

test::test() 
{ 
    // constructor is empty. 
    // We don't initialize static data member here, 
    // because static data initialization will happen on every constructor call. 
} 
Powiązane problemy