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


Anmelden zum Antworten