statisches Callback



  • Hi,

    ich hab nen Problem in meiner Singleton-Klasse.
    In dieser will ich nen Callback haben. Das muss, soweit ich das verstanden hab, ja als static markiert sein. So siehts aus:

    #include <string>
    #include <iostream>
    
    void foo( std::string &str, size_t n )
    {
    	std::cout << str << ": " << n << std::endl;
    }
    
    class Singleton
    {
    	Singleton( ) { }
    	Singleton( const Singleton& s ) { }
    	Singleton& operator=( const Singleton& s );
    
    	//Callback
    	void (*callback)( std::string s, size_t n );
    
    	public:
    		~Singleton( ) { }
    		static Singleton& getInstance( )
    		{
    			static Singleton s;
    			return s;
    		}
    		bool doSomething( )
    		{
    			if( !callback ) return false;
    			Singleton::callback( "Hello", 5 );
    			return true;
    		}
    };
    
    //Fehler: variable or field 'callback' declared void
    void Singleton::callback = foo;
    
    //Fehler: expected unqualified-id before '(' token
    void Singleton::( *callback )( std::string s, size_t n ) = foo;
    
    int main( )
    {
    	Singleton::getInstance().doSomething(); //erwartete Ausgabe: "Hello: 5"
    	return 0;
    }
    

    Ich hoffe, das Problem ist klar. Wie initialisiere ich nen statisches Callback?
    Nach den zwei Versuchen ist meine kreativität, wie es noch sein könnte, zu Ende 😉

    MfG. Christoph Ludwig



    static void (*callback)...
    
    Singleton::callback = foo;
    

    😉



  • wenn ich unter die Klasse

    Singleton::callback = foo;
    

    schreibe, kommt der Fehler:
    Expected constructor, destructor, or type conversion before '='

    funzt ni ...



  • Weil der Typ der Variable fehlt.



  • ... weil singleton2 mir vorgeschlagen hat, eben diesen wegzulassen.

    noch einen Fehler entdeckt. In der Klasse muss callback natürlich statisch sein:

    class Singleton {
        static void (*callback)(std::string,size_t);
    }
    

    aber ich habs jetzt hinbekommen. Man muss bei Fehlern auch mal alles hin- und herschieben:

    #include <string>
    #include <iostream>
    
    void foo( std::string &str, size_t n )
    {
    	std::cout << str << ": " << n << std::endl;
    }
    
    class Singleton
    {
    	Singleton( ) { }
    	Singleton( const Singleton& s ) { }
    	Singleton& operator=( const Singleton& s );
    
    	//Callback
    	static void (*callback)( std::string& s, size_t n );
    
    	public:
    		~Singleton( ) { }
    		static Singleton& getInstance( )
    		{
    			static Singleton s;
    			return s;
    		}
    		bool doSomething( std::string str )
    		{
    			if( !callback ) return false;
    			Singleton::callback( str, 5 );
    			return true;
    		}
    };
    void (*Singleton::callback)(std::string&,size_t) = foo;
    
    int main( )
    {
    	Singleton::getInstance().doSomething( "Hello" ); //erwartete Ausgabe: "Hello: 5"
    	return 0;
    }
    

    So funktionierts...



  • Wenn du das Prinzip verstanden hast, kannst du dir auch mal boost::function und boost::bind anschauen. Mit diesen beiden Bibliotheken kannst du Funktionsobjekte wirklich sehr schön handhaben.


Anmelden zum Antworten