multiple definition of "Klasse::anzahl" und andere Probleme ...
-
Hallo!
Ich habe folgende Klasse:class Klasse { public: Klasse(const char* s) { ++anzahl; } Klasse(const Klasse& k) { ++anzahl; } virtual ~Klasse() { --anzahl; } private: static size_t anzahl; }; size_t Klasse::anzahl = 0;Diese Klasse wird noch vererbt:
class Abgeleitet : public Klasse { public: Abgeleitet() : Klasse("bla") {} Abgeleitet(const Abgeleitet& ab) { machwas; } };Nun bekomm ich folgende Fehlermeldungen:
multiple definition of 'Klasse::anzahl'(am Ende von main als Haltepunkt)
Und bei der zweiten Klasse:
Keine passende Funktion fuer Aufruf Klasse::Klasse()(beim Kopierkonstruktor von Abgeleitet)
Was fuer Definitionen von anzahl? Es gibt doch nur eine ...
Wieso wird denn nicht der Kopierkonstruktor von Klasse automatisch aufgerufen und versucht einen Standardkonstruktor von Klasse zu finden?Gruss
Cartman
-
Eric Cartman schrieb:
Nun bekomm ich folgende Fehlermeldungen:
multiple definition of 'Klasse::anzahl'(am Ende von main als Haltepunkt)
Du solltest die Definition der Variable in eine .cpp-Datei verlagern.
Eric Cartman schrieb:
Und bei der zweiten Klasse:
Keine passende Funktion fuer Aufruf Klasse::Klasse()(beim Kopierkonstruktor von Abgeleitet)
Hm... Schreib den Basisklassenkopierkonstruktoraufruf (;)) mal ausdrücklich hin...
-
Eric Cartman schrieb:
Nun bekomm ich folgende Fehlermeldungen:
multiple definition of 'Klasse::anzahl'(am Ende von main als Haltepunkt)[/cpp]
Wenn du die Definition im header stehen hast und den merhmals einbindest dann hast du in jeder Übersetzungseinheit wo du den Header einbindest die Definition stehen. Das mag der Linker nicht. Pack die Definition in die .cpp
Und bei der zweiten Klasse:
Keine passende Funktion fuer Aufruf Klasse::Klasse()(beim Kopierkonstruktor von Abgeleitet)
Wieso wird denn nicht der Kopierkonstruktor von Klasse automatisch aufgerufen und versucht einen Standardkonstruktor von Klasse zu finden?
Weil der Kopierkonstruktor von Klasse nur in den automatisch generierten Kopierkonstruktor eingebaut wird. Bei normalen Copy-Ctors musst du ihn selbst aufrufen:
Abgeleitet(const Abgeleitet& ab) : Klasse(ab) { machwas; }
-
Konnte das erste Problem loesen. In Der abgeleiteten Klasse hatte ich ebenfalls eine (private) size_t Variable mit dem Namen "anzahl" - verstehe den Fehler aber trotzdem nicht ...
Zur zweiten Sache: Ja das finde ich eben auch etwas merkwuerdig... Wie kann ich denn den Basisklassen-Kopierkonstruktor "ausdruecklich hin schreiben"? Ich meine, wie greife ich auf das Basisklassensubobjekt in der abgeleiteten Klasse?
Gruss
Cartman
-
@cartman: siehe meine erklärungen

Du kannst den Basis-Ctor wie von mir beschrieben mit dem abgeleiteten Objekt aufrufen, so wie man bei anderen Funktionen auch ein abgeleitetes Objekt an Stelle der Basis einsetzen kann.
-
pumuckl schrieb:
Eric Cartman schrieb:
Nun bekomm ich folgende Fehlermeldungen:
multiple definition of 'Klasse::anzahl'(am Ende von main als Haltepunkt)[/cpp]
Wenn du die Definition im header stehen hast und den merhmals einbindest dann hast du in jeder Übersetzungseinheit wo du den Header einbindest die Definition stehen. Das mag der Linker nicht. Pack die Definition in die .cpp
Und bei der zweiten Klasse:
Keine passende Funktion fuer Aufruf Klasse::Klasse()(beim Kopierkonstruktor von Abgeleitet)
Wieso wird denn nicht der Kopierkonstruktor von Klasse automatisch aufgerufen und versucht einen Standardkonstruktor von Klasse zu finden?
Weil der Kopierkonstruktor von Klasse nur in den automatisch generierten Kopierkonstruktor eingebaut wird. Bei normalen Copy-Ctors musst du ihn selbst aufrufen:
Abgeleitet(const Abgeleitet& ab) : Klasse(ab) { machwas; }Danke, jetzt klappt alles

Der erste Fehler war trotzdem noch da, also hatte ich mich zu frueh gefreut. Der Fehler liess sich aber wie du und Nexus bereits gesagt habt bereinigen, indem ich die static-Variable in der CPP-Datei definiert hab.
gruss
Cartmanedit: aber warum wird die Variable mehrmals definiert, wenn sie in der Header-Datei steht? ich hab doch die Praeprozessor-Direktiven #ifndef etc. benutzt...
-
Eric Cartman schrieb:
edit: aber warum wird die Variable mehrmals definiert, wenn sie in der Header-Datei steht? ich hab doch die Praeprozessor-Direktiven #ifndef etc. benutzt...
Das Problem liegt beim Linker. Jedes Modul, das die Definition einbindet, hat anschliessend in der kompilierten .obj-Datei eine eigene Definition. Beim Verknüpfen der Objektdateien existieren dann mehrere Definitionen, was zu dem Fehler führt.
-
Nexus schrieb:
Eric Cartman schrieb:
edit: aber warum wird die Variable mehrmals definiert, wenn sie in der Header-Datei steht? ich hab doch die Praeprozessor-Direktiven #ifndef etc. benutzt...
Das Problem liegt beim Linker. Jedes Modul, das die Definition einbindet, hat anschliessend in der kompilierten .obj-Datei eine eigene Definition. Beim Verknüpfen der Objektdateien existieren dann mehrere Definitionen, was zu dem Fehler führt.
Verstehe, danke fuer die Erklaerung

gruss
Cartman