Vielleicht ist es einfacher zu verstehen, wenn Sie darüber nachdenken, was der Präprozessor tatsächlich tut: Er kopiert den Inhalt aller enthaltenen Header-Dateien in die cpp-Datei und übergibt diese an den Compiler.
Lassen Sie uns jetzt sagen, Sie haben:
// In a.cpp
#include <baseclass.h>
// more code
// In b.cpp
#include <baseclass.h>
// more code
Nach der Präprozessor erweitert das enthält, werden beide Dateien enthalten:
int BaseClass::x = 10;
Jetzt, sobald beide Objektdateien an den Linker übergeben werden, es wird das Symbol BaseClass::x
zweimal sehen - was ein Fehler ist.
Jetzt ist es noch deutlicher zu machen, stellen Sie sich dies in einer Header-Datei setzen würde:
int aGlobalVariable = 10;
Und dann sind sie in zwei verschiedenen CPP-Dateien, die beide in eine ausführbare Datei verknüpft werden soll. Es ist eigentlich nicht anders als Ihr Beispiel, wenn man es aus der Sicht des Linkers betrachtet.
Warum ist dies kein Problem mit Klassendeklarationen?
Es gibt einen Unterschied zwischen Erklärungen und Definitionen. Nur letzteres wird Probleme verursachen. Z.B., Alle folgenden sind Erklärungen:
extern int a;
void foo(int a);
class Foo { int bar(); };
Während diese sind Definitionen:
int a;
int b = 10;
void foo(int a) { /*..*/ }
int Foo::bar() { /*...*/ }
Solange es ist (und man nur) Definition, können Sie so viele Erklärungen haben, wie Sie möchten, und die Linke wird sicherstellen, dass sie alle beziehen sich auf die gleiche Funktion oder Speicherstelle.
Nun, was ist mit Klassen? Klassen können nur deklariert werden, während ihre Elementfunktionen und statischen Mitglieder definiert werden müssen. Auch hier kann jede Definition nur einmal vorkommen.
Memberfunktionen und statische Member sind tatsächlich nur einmal im Adressraum eines Programms vorhanden, während normale Member (Instanzvariablen) für jedes Objekt der Klasse existieren.
Zurück zu Ihrem spezifischen Problem: statische Mitglieder sind im Grunde nur globale Variablen, aber auf den Klassennamen beschränkt.
Hoffe, dass dies die Dinge für Sie aufräumt!
Die Frage Phrasierung und Antworten hier sind besser als die in der nominierten Frage! –