namespace und multiple definitions
-
Hallo,
ich habe folgendes Problem. Ich würde gerne ein Objekt global in meinem
Programm zur Verfügung stellen...
Um es global sicher verwenden zu können hab ich das objekt in einen Namespace
eingebettet..
Mein Headerfile schaut so aus:#ifndef LOGFILEHANDLER_H #define LOGFILEHANDLER_H #include "filehandler.h" #include <iostream> class LogFileHandler : public FileHandler{ public: LogFileHandler(const string&, ios_base::openmode mode = fstream::out | fstream::app); ~LogFileHandler(); void resetFile(); LogFileHandler& operator<<(const int& line); LogFileHandler& operator<<(const float& line); LogFileHandler& operator<<(ostream& ( *pf )(ostream&)); LogFileHandler& operator<<(const char line[]); private: const string& readLine(){} void writeLine(); string line; }; namespace debuglog{ LogFileHandler logfile("./mesydaq.log"); }; #endif
Wenn ich jetzt dieses Header in mehreren cpp Dateien einbinde, und den namespace
debuglog verwende bekomme ich die logische Fehlermeldung vom Linker:udpserver.lo(.bss+0x20): multiple definition of `debuglog::logfile' mesydaq.lo(.bss+0x20): first defined here histogram.lo(.bss+0x20): multiple definition of `debuglog::logfile' mesydaq.lo(.bss+0x20): first defined here cpu.lo(.bss+0x20): multiple definition of `debuglog::logfile' mesydaq.lo(.bss+0x20): first defined here mpsd8.lo(.bss+0x20): multiple definition of `debuglog::logfile' mesydaq.lo(.bss+0x20): first defined here logfilehandler.lo(.bss+0x20): multiple definition of `debuglog::logfile' mesydaq.lo(.bss+0x20): first defined here
Jetzt meine Frage:
Wie kann ich es bewerkstelligen, das objekt logfile global in meiner
Applikation zr Verfügung zu stellen?Danke für jeden Vorschlag
So long...
RedWing
-
Also ich hab jetzt einen Weg gefunden, und zwar indem ich
logfile im namespace einfach als static deklariere.
Aber irgendwie müsste es doch auch ohne static gehen oder?Gruß
RedWing
-
nein, dafür ist das schlüsselword static doch gedacht.
du hast multiple declerations, weil die header datei mehrmals included wurde. da nützt der namespace nix ( ist auch nicht dafür gedacht ). static heist ja, das dieser object nur einmal im gesammtem programm ist.
-
DEvent schrieb:
du hast multiple declerations, weil die header datei mehrmals included wurde.
Er hat mehrfache Definitionen. Mehrfache Deklarationen sind kein Problem.
static heist ja, das dieser object nur einmal im gesammtem programm ist.
Nein. Static bedeutet, beschränkt auf die Übersetzungseinheit. Mit static hat er eine Instanz von LogFileHandler pro .cpp-Datei. Das will er vermutlich nicht.
@RedWing:
Mach die Deklaration in der Headerdatei extern und definiere die LogFileHandler-Instanz in einer .cpp-Datei.
-
Erstmal danke euch beiden.
mfks Ratschlag war das was ich beabsichtigt hatte,Mfg
RedWing