2008-10-12 11 views
99

Sehr einfach ausgedrückt:nicht aufgelöstes externes Symbol auf statische Klassenmitglieder

ich eine Klasse, die hauptsächlich aus statischen öffentlichen Mitgliedern besteht, so kann ich Gruppe ähnliche Funktionen zusammen, die noch von anderen Klassen/Funktionen aufgerufen werden müssen.

Wie auch immer, ich habe zwei statische nicht signierte char-Variablen in meiner Klasse öffentlichen Bereich definiert, wenn ich versuche, diese Werte in der gleichen Klasse 'Konstruktor zu ändern, bekomme ich ein "nicht aufgelöstes externes Symbol" Fehler bei der Kompilierung.

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

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

Ich bin neu in C++ so gehen Sie einfach auf mich. Warum kann ich das nicht tun?

Antwort

112

Sie haben vergessen, die Definitionen hinzufügen, um Ihre Erklärungen von X und Y

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

irgendwo passen. Vielleicht möchten Sie auch ein statisches Element

unsigned char test::X = 4; 

initialisieren und wieder, was Sie tun, dass in der Definition (in der Regel in einer CXX-Datei) nicht in der Erklärung (die oft in einer .H-Datei ist)

+1

Wenn Sie Kopf nur Bibliothek schreiben, können Sie diese Technik verwenden CPP-Datei zu vermeiden: http://stackoverflow.com/questions/11709859/how-to-have-static -data-members-in-einem-Header-only-library – ShitalShah

54

Statische Datenmemberdeklarationen in der Klassendeklaration sind keine Definition von ihnen. Um sie zu definieren, sollten Sie dies in der Datei .CPP tun, um doppelte Symbole zu vermeiden.

Die einzigen Daten, die Sie deklarieren und definieren können, sind ganzzahlige statische Konstanten. (Werte von enums kann auch als konstante Werte verwendet werden)

Vielleicht möchten Sie den Code neu zu schreiben wie:

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

test::test() { 
} 

Wenn Sie die Fähigkeit haben wollen Sie statische Variablen zu ändern (in anderen Worten, wenn es ist nicht angebracht, sie als const) zu deklarieren, können Sie Sie Code zwischen .H und .CPP in der folgenden Art und Weise trennen:

· 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. 
}