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.
Wie auch immer, ich habe zwei statische vorzeichenlose Zeichenvariablen in meinem öffentlichen Klassenbereich definiert. Wenn ich versuche, diese Werte im Konstruktor derselben Klasse zu ändern, wird beim Kompilieren der Fehler "ungelöstes externes Symbol" 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 tun?
Statische Datenelementdeklarationen in der Klassendeklaration sind keine Definition von ihnen. Um sie zu definieren, sollten Sie dies in der tun
.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:
Wenn Sie die Möglichkeit haben möchten, Ihre statischen Variablen zu ändern (dh wenn es unangemessen ist, sie als const zu deklarieren), können Sie Ihren Code zwischen
.H
und.CPP
auf folgende Weise trennen :.H:
.CPP:
quelle
Da dies der erste SO-Thread ist, der mir bei der Suche nach "ungelösten externen Elementen mit statischen const-Elementen" im Allgemeinen aufgefallen ist, werde ich hier einen weiteren Hinweis hinterlassen, um ein Problem mit nicht aufgelösten externen Elementen zu lösen:
Für mich war das, was ich vergessen habe, meine Klassendefinition zu markieren
__declspec(dllexport)
, und als ich von einer anderen Klasse (außerhalb der DLL-Grenzen dieser Klasse) aufgerufen wurde, bekam ich natürlich meinen ungelösten externen Fehler.Es ist jedoch 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.
quelle
In meinem Fall habe ich eine statische Variable in der .h-Datei deklariert, wie z
und in myClass.cpp habe ich versucht, dieses m_nMyVar zu verwenden. Es wurde ein LINK-Fehler wie folgt angezeigt:
Fehler LNK2001: ungelöstes externes Symbol "public: static class ... Die mit dem Linkfehler verbundene cpp-Datei sieht folgendermaßen aus:
Also füge ich den folgenden Code oben in myClass.cpp hinzu
dann ist LNK2001 weg.
quelle
In meinem Fall habe ich eine falsche Verknüpfung verwendet.
Es wurde c ++ (cli) verwaltet, aber mit nativem Export. Ich habe der DLL der Bibliothek, aus der die Funktion exportiert wird, zu Linker -> Eingabe -> Assembly-Link-Ressource hinzugefügt. Für die native C ++ - Verknüpfung ist es jedoch erforderlich, dass die .lib-Datei die Implementierungen in cpp korrekt "sieht". Daher hat es mir geholfen, die .lib-Datei dem Linker hinzuzufügen -> Eingabe -> zusätzliche Abhängigkeiten.
[Normalerweise verwendet verwalteter Code keinen DLL-Export und -Import, sondern Verweise, aber das war eine einzigartige Situation.]
quelle