template klasse



  • template <class T>
    class testbase {
    protected:
    	T	m_var;
    public:
    	testbase() {};
    	~testbase() {};
    };
    
    class test: public testbase<int> {
    public:
    	test(): m_var(0) {}; // fehler, m_var is not a base or member
    	~test() {};
    	int get() {};
    };
    

    kann man m_var nicht in initialisierungsliste initialisieren?



  • T ist die Templateklasse, also:

    template <class T> 
    class testbase { 
    protected: 
        T    m_var; 
    public: 
        testbase() {}; 
        ~testbase() {}; 
    }; 
    
    template <class T>
    class test: public testbase<T> { 
    public: 
        test(): m_var(0) {}; 
        ~test() {}; 
        int get() {}; 
    };
    


  • m_var gehört zu testbase<>. Die Initialisierung von m_var via Initialisierungsliste kann nur im Konstruktor von testbase<> erfolgen. Du kannst aber einen entsprechenden Konstruktor dort anlegen und den von test aus aufrufen:

    template <class T>
    class testbase {
    protected:
    	T	m_var;
    
    	// destruktor entweder protected machen...
    	// ~testbase() {}
    public:
    	explicit testbase(T const& x) : m_var(x) {}
    
    	// ...oder public und virtual
    	virtual ~testbase() {}
    };
    
    class test: public testbase<int> {
    public:
    	test(): testbase(0) {}
    	// ~test() {} // brauchen wir nicht!
    	int get() const {return this->m_var;}
    };
    

    Aber: public inheritance wird bei Dir scheinbar nicht gebraucht. Sonst hättest Du noch ein paar mehr (eventuell virtuelle) Funktionen in testbase<> drin. Wenn Du hier keine Polymorphie brauchst, lass das einfach mit der Vererbung. Du kannst ja auch ein testbase<int> als Element in test anlegen (oder privat von Erben, wenn's unbedingt sein muss).



  • Kóyaánasqatsi schrieb:

    T ist die Templateklasse, also: [...]

    Was hat das bitte schön mit dem Problem zu tun?



  • sososo schrieb:

    m_var gehört zu testbase<>. Die Initialisierung von m_var via Initialisierungsliste kann nur im Konstruktor von testbase<> erfolgen. Du kannst aber einen entsprechenden Konstruktor dort anlegen und den von test aus aufrufen:

    template <class T>
    class testbase {
    protected:
    	T	m_var;
    
    	// destruktor entweder protected machen...
    	// ~testbase() {}
    public:
    	explicit testbase(T const& x) : m_var(x) {}
    
    	// ...oder public und virtual
    	virtual ~testbase() {}
    };
    
    class test: public testbase<int> {
    public:
    	test(): testbase(0) {}
    	// ~test() {} // brauchen wir nicht!
    	int get() const {return this->m_var;}
    };
    

    Aber: public inheritance wird bei Dir scheinbar nicht gebraucht. Sonst hättest Du noch ein paar mehr (eventuell virtuelle) Funktionen in testbase<> drin. Wenn Du hier keine Polymorphie brauchst, lass das einfach mit der Vererbung. Du kannst ja auch ein testbase<int> als Element in test anlegen (oder privat von Erben, wenn's unbedingt sein muss).

    n1 loesung, vielen dank, dein code sieht sehr ordentlich aus, profi coder wat


Anmelden zum Antworten