Problem mit static "Already defined in xx.obj"



  • Hier die Klasse, er sagt das s_iNextID schon in ddd.obj definiert ist!??? warum?

    //

    #####################################################################################
    //
    // Class:			CModul
    // Name:			Systemmodul als abstrakte Basisklasse (Handler,Processmodul)
    // Description:		Basismodul Parameter 
    //
    //#####################################################################################
    class CModul{
    private:
    
    	static UINT s_iNextID;
    
    protected:
    
    	//Modul ID
    	UINT m_iModulID;
    
    	//Modulname
    	std::string m_strName;
    
    	//Modul bereit/aktiviert!
    	BOOL m_boReady;
    
    public:
    
    	//Konstruktor
    	CModul(/*UINT iD=1,*/std::string strN="NONAME") :	m_iModulID(s_iNextID++), 
    													m_strName(strN),
    													m_boReady(true){
    
    	}
    	//Destruktor
    	virtual ~CModul()=0{}
    
    	virtual inline const BOOL &isReady() { return m_boReady; }
    	virtual inline const UINT &ID() { return m_iModulID; }
    	virtual inline const std::string &GetName() { return m_strName; }
    
    };
    UINT CModul::s_iNextID=1; //Statische ID Varia
    


  • BorisDieKlinge schrieb:

    Hier die Klasse, er sagt das s_iNextID schon in ddd.obj definiert ist!??? warum?...

    Ich schätze, weil Du den Header in mehreren Modulen includiert hast.
    Dann taucht auch in jedem Modul das hier:

    BorisDieKlinge schrieb:

    ...

    ...
    UINT CModul::s_iNextID=1; //Statische ID Varia
    

    auf ... und der Linker weiß nicht, welches dieser (namensgleichen) Objekte er
    nehmen soll.
    Lösung: Variable in einem cpp definieren und nicht in einem Header.

    EDIT 👍 😋 👍 "Scheller als CSTooooll, schneller als CStooooll !!! und noch länger dazu !!" Heut' ist ein guter Tag. 😉
    Gruß,

    Simon2.



  • Die Definition der statischen Variablen sollte auch nicht im Header stehen, sondern in der dazugehörigen Source-Datei - sonst wird die Variable in jeder Übersetzungseinheit definiert -> BUUM



  • auch wenn die header mit

    #pragma once
    

    deklariet ist?



  • Ist das Gepostete ein Header? Wenn Du ihn mehrmals einbindest entsteht der Fehler. Einfach die Zeile

    UINT CModul::s_iNextID=1; //Statische ID Varia
    

    in eine cpp Datei verschieben.



  • once sagt nur das einmal pro cpp Kompilierung (cpp -> obj) eingebunden wird. Wenn aber die ganzen cpp Objekte zusammen gelinkt werden ist die Variable auf einmal mehrmals da.



  • BorisDieKlinge schrieb:

    auch wenn die header mit

    #pragma once
    

    deklariet ist?

    Hilft nichts, weil dieses pragma nur dafür sorgt dass der Header pro Übersetzungseinheit nur einmal vorkommt.
    Dein Problem liegt aber darin, dass der Header (was er ja auch soll) in mehreren Übersetzungseinheiten gezogen wird (da dann jeweils nur einmal, aber das hilft Dir nicht).
    Anschaulich:
    once schützt Dich davor:

    obj1: x x x
    

    ... aber nicht davor:

    obj1: x
    obj2: x
    obj3: x
    

    😉

    Gruß,

    Simon2.



  • Hähähähä 🤡


Log in to reply