komplizierte vererbung



  • //test.h
    
    class CObject {
    protected:
    	static DWORD	m_dwObjectSize;			// size in bytes of all objects
    
    	virtual void IncObjectSize() = 0;			// increase the number of objects size
    	virtual void DecObjectSize() = 0;			// decrease the number of objects size
    
    public:
    CObject(){};
    ~CObject(){};
    };
    
    template <typename T>
    class testbase: public CObject {
    	void IncObjectSize();
    	void DecObjectSize();
    
    protected:
    	T	m_var;
    
    public:
    	explicit testbase(const T& value): m_var(value) {};
    	virtual ~testbase() {};
    
            T& operator=(const T& obj);
    };
    
    class test: public testbase<int> {
    public:
    	test(): testbase(0) {};
    	~test() {};
    	int get() const { return this->m_var; };
    };
    
    // test.cpp
    DWORD	CObject::m_dwObjectSize		= 0;
    
    template<typename T>
    void testbase<T>::IncObjectSize() {
    	m_dwObjectSize		+= sizeof(T);
    }
    
    template<typename T>
    void testbase<T>::DecObjectSize() {
    	m_dwObjectSize		-= sizeof(T);
    }
    
    template<typename T>
    T& testbase<T>::operator=(const T& value) {
    
    }
    

    hier hab ich link fehler

    Error 1 error LNK2001: unresolved external symbol "private: virtual void __thiscall testbase<int>::DecObjectSize(void)" (?DecObjectSize@?testbase@H@@EAEXXZ) main.obj testprj Error 2 error LNK2001: unresolved external symbol "private: virtual void __thiscall testbase::IncObjectSize(void)" (?IncObjectSize@?testbase@H@@EAEXXZ) main.obj testprj



  • template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
    Das gehört in den Header! Außer es sind Spezialisierungen.



  • no_cpp schrieb:

    template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
    Das gehört in den Header! Außer es sind Spezialisierungen.

    wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall



  • JnZn558 schrieb:

    wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall

    Er hat aber recht. Pack die Implementierung in die Header-Datei, dann wird es gehen.



  • JnZn558 schrieb:

    no_cpp schrieb:

    template Implementierungen gehören nicht in ne separate cpp-Datei!!!!
    Das gehört in den Header! Außer es sind Spezialisierungen.

    wenn du recht hast, dann muesste der operatorueberladung auch linkfehler verursachen, dies is aber nicht der fall

    Dann verwende deinen operator= mal. wirst sehen, dann bekommst du deinen Linker-Error!



  • hab IncObjectSize() und DecObjectSize() in die Headerdatei gepackt, und operator=() bleib in cpp datei, und es kompliert problemlos, nun es dies find ich scheiss, dass implementierung in der headerdatei is, wieso geht bei operator, aber bei den andere beide nicht.


  • Mod

    Der Operator geht auch nichzt, du benutzt ihn bloß nicht, weswegen der Linker auch nicht nach dem Symbol sucht.



  • JnZn558 schrieb:

    hab IncObjectSize() und DecObjectSize() in die Headerdatei gepackt, und operator=() bleib in cpp datei, und es kompliert problemlos, nun es dies find ich scheiss, dass implementierung in der headerdatei is, wieso geht bei operator, aber bei den andere beide nicht.

    lies doch wenigsten einmal nach, was du geschrieben hast, bevor du auf absenden klickst... wenn nicht jeder schon davor gewusst hätte, was du willst, hätte das hier wahrscheinlich keiner verstanden...


Anmelden zum Antworten