doppelte definirung



  • //i.hpp
    #ifndef _ICH_HPP_
    #define _ICH_HPP_
    class Ich{
      int a;
      Ich();
      void funk();
    }Ich;
    #endif
    
    //i.cpp
    #include "i.hpp"
    Ich::Ich(): a(10){}
    void Ich::funk(){
      //mach was
    }
    
    #ifndef _DU_HPP_
    #define _DU_HPP_
    //d.hpp
    #include "i.hpp"
    class Du{
       Du();
    }
    #endif
    
    //d.hpp
    #include "d.hpp"
    
    Du::Du(){
      Ich.funk();
    }
    
    #include "d.hpp"
    
    int main()
    {
    
    }
    

    meldung:
    main.cxx 3: multiple definition of `Ich'



  • Du definierst in „i.hpp“ eine Instanz Deiner Klasse 'Ich' (mit demselben Namen). Deine HPP-Datei wird aber in mehrere Code-Einheiten eingebunden, wodurch die multiple Instanzierung entsteht.

    Einfache Lösung: deklarier 'Ich' im Header lediglich (d.h. als 'extern' markieren' und definier's in der „i.cpp“-Datei.



  • //i.hpp
    #ifndef _ICH_HPP_
    #define _ICH_HPP_
    class Ich{
      int a;
      Ich();
      void funk();
    };
    #endif
    
    //i.cpp
    #include "i.hpp"
    
    extern Ich Ich;
    
    Ich::Ich(): a(10){}
    void Ich::funk(){
      //mach was
    }
    
    #ifndef _DU_HPP_
    #define _DU_HPP_
    //d.hpp
    #include "i.hpp"
    class Du{
       Du();
    }
    #endif
    
    //d.hpp
    #include "d.hpp"
    
    Du::Du(){
      Ich.funk();  //hier
    }
    

    jetzt meldet er das er Ich nicht finden kann



  • Du verwechselst Deklaration und Definition. Die Deklaration muss in den Header, die Definition in die cpp-Datei:

    // i.hpp
    
    #ifndef _ICH_HPP_
    #define _ICH_HPP_
    class Ich{
      int a;
      Ich();
      void funk();
    };
    
    extern Ich Ich;
    
    #endif
    
    // i.cpp
    
    #include "i.hpp"
    
    Ich Ich;
    
    // … der Rest
    


  • es klappt thx ^^



  • Nich was: nenn die globale Variable nicht genauso wie den Typ, das gibt Probleme. Und verzichte am besten ganz auf die globale Variable, das gibt Ärger mit der Initialisierungsreihenfolge der Objekte etc. Besser ist es, eine globale Funktion zu verwenden, die eine statisches Instanz zurückgibt, oder die Klasse als Singleton zu implementieren.


Anmelden zum Antworten