Zeiger auf Memberfunktionen & Singleton



  • Hallo,

    ich habe ein kleines Problem. Ich habe eine Funktion der ich Funktionszeiger übergeben muss. Dieser Funktion möchte ich aber jetzt einen Zeiger auf eine Methode einer Klasse übergeben, das funktioniert jedoch nur wenn die Methode statisch ist. Da meine Klasse aber so oder so Singleton ist, wollte ich fragen ob es da vielleicht nicht doch noch eine andere Möglchkeit gäbe. Die Singleton existiert ja so oder so nur einmal, da müsste ich ja die Funktionen nicht alle static machen, wenn das mit dem Funktionszeiger irgendwie funktionieren würde.
    Gibt es da einen Trick, oder geht das auch nicht?
    Ich habe in der FAQ gesehen, dass das evt. mem_fun1_ref gehen könnte. Aber ich hoffe, dass es einen speziellen Trick für Singletons gibt 😃



  • Hallo,

    die Binder Der STL oder von Boost geben dir jeweils ein sog. Funktionsobjekt zurück - also mit überaldenen operator(). Das ganze bringt dir aber nichts wenn du einen Funktionspointer brauchst.

    Gruß



  • Ich brauche einen Funktionspointer... 😞



  • Wo genau ist dein Problem?

    [static] void doSomething()
    {
      Singleton& s = Singleton::getInstance();
      // ...
    }
    


  • finix schrieb:

    Wo genau ist dein Problem?

    [static] void doSomething()
    {
      Singleton& s = Singleton::getInstance();
      // ...
    }
    

    Ich seh hier keinen Methoden-Pointer?

    MfG SideWinder



  • SideWinder schrieb:

    Ich seh hier keinen Methoden-Pointer?

    Wundert mich kaum. Ich sehe auch keinen.

    Edit: Sieht aber auch nicht so aus als ob lustig unbedingt einen braucht...



  • finix schrieb:

    Wo genau ist dein Problem?

    [static] void doSomething()
    {
      Singleton& s = Singleton::getInstance();
      // ...
    }
    

    Kann ich theoretisch schon so machen, aber ich dachte es gaebe einen eleganteren Weg, als fuer jede Methode der Singleton eine neue Funktion zu schreiben. Diese Funktion wuerde ja nichts anderes tun, als die entsprechende Methode der Singleton auf zu rufen. Es wäre viel schöner, wenn ich die Methode direkt uebergeben könnte anstatt auf so einem Umweg... 🙂



  • Hmm, ich bin meinem Ziel ein kleines Stueck naeher gekommen. Ich kann eine statische Funktion definieren und die als Funktionspointer uebergeben. In dieser statischen Funktion kann ich dann ueber eine weitere Instanz der Singleton auch auf nicht statische Variablen zugreifen:

    [static] void singleton::test()
    {
      singleton *pSingleton=singleton::getInstance();
      //durch pSingleton kann ich jetzt auch auf nicht statische
      //Elemente zugreifen...
    }
    

    aber es gefaellt mir auch nicht so wirklich. Es gibt doch sicher einen schoeneren und direkteren Weg...

    P.S. Sorry, aber ich habe auf dieser Tastatur im Moment keine Umlaute 😉



  • Mit einer Template-Funktion kannst Du die Erzeugung einer Funktion generalisieren:

    #include <iostream> 
    
    template <typename singletonType, void (singletonType::*memFunc)()>
    void singletonFunction()
    {
      singletonType* instance = singletonType::getInstance();
      (instance->*memFunc)();
    }
    
    class MySingleton
    {
        static MySingleton instance;
        MySingleton() { }
        MySingleton(const MySingleton&);
        MySingleton operator= (const MySingleton&);
      public:
        static MySingleton* getInstance()  { return &instance; }
        void aFunction()  { std::cout << "aFunction called" << std::endl; }
    };
    
    MySingleton MySingleton::instance;
    
    // hier wird ein Zeiger auf eine Funktion benötigt
    void callFunction(void (*func)())
    {
      func();
    }
    
    int main()
    {
      // hier wird mit dem Template eine Funktion instantiiert
      callFunction(singletonFunction<MySingleton, &MySingleton::aFunction>);
    }
    

    Tommi


Anmelden zum Antworten