it-swarm.com.de

Nicht aufgelöstes externes Symbol für statische Klassenmitglieder

Ganz einfach gesagt:

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

Auf jeden Fall habe ich zwei statische vorzeichenlose Zeichenvariablen in meinem öffentlichen Klassenbereich definiert. Wenn ich versuche, diese Werte im selben Klassenkonstruktor zu ändern, wird beim Kompilieren der Fehler "Externes Symbol ungelöst" angezeigt.

class test 
{
public:
    static unsigned char X;
    static unsigned char Y;

    ...

    test();
};

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

Ich bin neu in C++, also schont mich. Warum kann ich das nicht machen?

121
Daniel

Sie haben vergessen, die Definitionen so hinzuzufügen, dass sie Ihren Deklarationen von X und Y entsprechen

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

irgendwo. Möglicherweise möchten Sie auch ein statisches Element initialisieren

unsigned char test::X = 4;

und wieder tun Sie dies in der Definition (normalerweise in einer CXX-Datei), nicht in der Deklaration (häufig in einer .H-Datei).

134
Colin Jensen

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

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

Möglicherweise möchten Sie Ihren Code wie folgt umschreiben:

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

test::test() {
}

Wenn Sie die Möglichkeit haben möchten, Ihre statischen Variablen zu ändern (mit anderen Worten, wenn es nicht angebracht ist, sie als const zu deklarieren), können Sie Ihren Code zwischen .H und .CPP auf die folgende Weise:

.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.
}
60
sergtk

Da dies der erste SO Thread ist, der bei der Suche nach "ungelösten externen Elementen mit statischen konstanten Elementen" im Allgemeinen aufgetaucht zu sein schien, werde ich einen weiteren Hinweis hinterlassen, um ein Problem mit ungelösten externen Elementen zu lösen Hier:

Für mich war das, was ich vergessen habe, meine Klassendefinition __declspec(dllexport) zu markieren, und als ich von einer anderen Klasse (außerhalb der DLL-Grenzen dieser Klasse) aufgerufen wurde, bekam ich natürlich den ungelösten externen Fehler.
Es ist dennoch leicht zu vergessen, wenn Sie eine interne Hilfsklasse in eine Klasse ändern, auf die von einer anderen Seite aus zugegriffen werden kann. Wenn Sie also in einem dynamisch verknüpften Projekt arbeiten, können Sie dies auch überprüfen.

3

in meinem Fall habe ich eine statische Variable in einer .h-Datei deklariert, wie z

//myClass.h
class myClass
{
static int m_nMyVar;
static void myFunc();
}

und in myClass.cpp habe ich versucht, dieses m_nMyVar zu verwenden. Es hat einen LINK-Fehler wie:

fehler LNK2001: nicht aufgelöstes externes Symbol "public: static class ... Die mit dem Verbindungsfehler verbundene CPP-Datei sieht folgendermaßen aus:

//myClass.cpp
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

Also füge ich den folgenden Code oben in myClass.cpp ein

//myClass.cpp
int myClass::m_nMyVar; //it seems redefine m_nMyVar, but it works well
void myClass::myFunc()
{
myClass::m_nMyVar = 123; //I tried to use this m_nMyVar here and got link error
}

dann ist LNK2001 weg.

2
Penny