Inline Konstruktor klappt, separate Definition nicht
-
Hallo, ich bearbeite gerade ein größeres Projekt mit directx9 in Visual Studio 2005. Ich versuche, eine existierende Klasse timer zu modifizieren. Dabei teile ich die existierende timer.cpp in timer.cpp und timer.h auf. Dabei passiert folgendes:
Klappt:
#include <time.h> #ifndef TIMER_H #define TIMER_H class timer { private: unsigned int ticks; public: timer() { ticks = 0;} int getTime(); }; #endifKlappt nicht:
#include <time.h> #ifndef TIMER_H #define TIMER_H class timer { private: unsigned int ticks; public: timer(); int getTime(); }; #endif timer::timer() { ticks = 0;}Fehlermeldung:
1>MhMasterMind.obj : error LNK2005: "public: __thiscall timer::timer(void)" (??0timer@@QAE@XZ) ist bereits in Core.obj definiert.Ich habe bereits alle
#include "timer.cpp"in
#include "timer.h"in anderen Klassen geändert. Google sagt mir, dass das Mehrfachincludierugen sind. Habe ich die nicht mit den Guards verhindert?
Danke schonmal!
-
Im übrigen klappt es auch nicht, den Konstruktor in timer.cpp zu definieren. Ich vermute das hat den selben Grund. Bei der memberfunktion int getTime() klappt es allerdings.
-
die implementierung muss in eine separate datei, wenn du das in der headerdatei unten drunter (sogar noch unter die includeguards) schreibst, dann ist klar, dass da der herr Linker meckert
und einbinden in andere dateien tust du eh nur die ehader datei
bsp:
// Timer.h #ifndef TIMER_H #define TIMER_H class Timer { public: Timer(); private: int member; }; #endif// Timer.cpp #include "Timer.h" Timer::Timer() : member(0) { member += 10; }// main.cpp #include "Timer.h" int main() { Timer t1; Timer t2; return 0x0; }
-
Das habe ich auch schon probiert. Ich habe das mal so gemacht:
#include <time.h> #ifndef TIMER_H #define TIMER_H class timer { private: unsigned int ticks; public: timer(); int getTime(); }; #endif#include "timer.h" timer::timer() { ticks = 0; } int timer::getTime() { return ticks * 1000 / CLOCKS_PER_SEC; }Gibt leider wieder einen Fehler, allerdings mit einer anderen Datei:
1>Timer.obj : error LNK2005: "public: __thiscall timer::timer(void)" (??0timer@@QAE@XZ) ist bereits in Core.obj definiert. 1>.\Debug/D3DSemArbVS05.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
-
Kann es sein, dass du die timer.cpp in core.cpp includierst?
-
Lies dir mal bitte im Buch deiner Wahl den Abschnitt zum Compilieren mit mehreren separaten Übersetzungseinheiten durch. Dort sollte beschrieben sein, was dahinter steckt. Danach wirst du auch in der Lage sein, das richtig zu handhaben. Aktuell sieht das so aus, als ob du ein wenig rumprobierst, weil du nicht genau weißt, wie es zu laufen hat - das ist nie eine gute Idee.
-
@Bashar:
So war es ursprünglich. Ich habe das zuerst zu timer.h geändert und inzwischen komplett rausgenommen, da die Klasse nirgends benutzt wird. Ist eine liegengebliebene Hausarbeit von vor zwei Jahren, bei der im Seminar einige ähnlich planlos und faul wie ich waren. Deshalb ist der Code ziemlich durcheinander.@pumuckl:
ertappt. Aber das Lesen wird mir wohl nicht erspart bleiben.
-
Ich habe jetzt die alte Klasse komplett rausgenommen und eine neue angelegt. Die habe ich nur da eingebunden, wo sie wirklich beötigt wird. Und siehe da, keine Probleme mehr.
@pumuckl: hat es etwas damit zu tun, dass die Klasse doppelt includiert wurde und daher beim Linke mehrfach definiert war?
-
wenn wirklich nur die header datei mehrmals inkludiert war und auch entsprechende include guards (oder #pragma once) gesetzt wurde, dann wid das keine linker probleme geben.
aber wenn die include guards fehlen oder die cpp datei mehrmals eingebunden war, dann gibts welche...