Methoden-Pointer in Klasse



  • Hallo!

    Kann mir jemand einen Tipp geben, wieso der Compiler hier meckert? Das Problem liegt offenbar in der get() methode bei der Zuweisung der destroy() methode an den Funktionspointer. Ich seh' einfach den Fehler nicht.

    Danke!

    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <vector>
    
    class variant
    {    
    	public:
    		variant()
    		{
    			m_data = NULL;
    			m_destructor = NULL;
    			}
    
    		~variant()
    		{
    			m_destructor();
    			}
    
    		template <class T>
    		void set(const T &obj)
    		{
    			m_destructor();
    			m_data = new T;
    			*(T*)m_data = obj;
    			m_destructor = destroy<T>;
    			}
    
    		template <class T>
    		T get()
    		{
    			return *(T*)m_data;
    			}
    
    	private:
    		template <class T>
    		void destroy()
    		{
    			delete((T*)m_data);
    			}
    
    		void (*m_destructor)();
    		void *m_data;
    	};
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
    
        variant x;
    
        x.set(string("hallo!"));
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Was sagt der Compiler?



  • SpiderFromMars schrieb:

    Was sagt der Compiler?

    30 C:\My Documents\main.cpp no matches converting function `destroy' to type `void (*)()'
    error C:\My Documents\main.cpp:42 candidates are: template<class T> void variant::destroy()


  • Mod

    variant::destroy ist eine nicht-statische Memberfunktion, also benötigst du einen Zeiger auf Memberfunktionen. also

    void (variant::*m_destructor)();
    

    und dann

    template <class T>
            void set(const T &obj)
            {
                if ( m_destructor != NULL )
                    ( this->*m_destructor )();
                m_data = new T( obj );
                m_destructor = &destroy<T>;
                }
    

    Alternativ könnte destroy auch eine statische oder freie Funktion sein (das ist möglicherweise flexibler):

    void (*m_destructor)(void*);
    


  • camper schrieb:

    variant::destroy ist eine nicht-statische Memberfunktion, also benötigst du einen Zeiger auf Memberfunktionen. also

    void (variant::*m_destructor)();
    

    und dann

    template <class T>
            void set(const T &obj)
            {
                if ( m_destructor != NULL )
                    ( this->*m_destructor )();
                m_data = new T( obj );
                m_destructor = &destroy<T>;
                }
    

    Alternativ könnte destroy auch eine statische oder freie Funktion sein (das ist möglicherweise flexibler):

    void (*m_destructor)(void*);
    

    Danke! 🕶 Das hat funktioniert.


Anmelden zum Antworten