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::functionundboost::bindanschauen. Mit diesen beiden Bibliotheken kannst du Funktionsobjekte wirklich sehr schön handhaben.