template - methoden-pointer



  • hola leute

    ich hab ne klasse my_class

    class my_class
    {
       public:
          void func(int x);
    };
    
    ...
    my_class an_objekt
    

    nun moechte ich in einer anderen klasse die adresse von 'an_object.func'
    speichern, damit ich sie irgendwann mal wieder aufrufen kann.

    template<class T>
    class another_class
    {
       public:
          another_class(void (*T)(int) t_func) : a_func(t_func) { }
          void RufeAuf(void) { a_func(12); }
          void (*T)(int) a_func;
    };
    

    die signatur der funktion ist immer die selbe, was parameter und rueckgabewert angeht.
    komme leider nicht drauf wie das funktioniert.

    Meep Meep



  • re

    habs mal bissl weiter gestrickt und bin jetzt auf folgendem stand:

    template<class T>
    class OneWayMsg : public BaseOneWayMsg
    {
       public:
          typedef void (T::*func)(int);
          OneWayMsg(T *obj, func t_func) : msg_func(t_func), object(obj) { }
          ~OneWayMsg(void) { }
    
          virtual void Message(int x)
          {
             (object.*msg_func)(3);
          }
    
       private:
          func msg_func;
          T *object;
    };
    

    erzeugen will ich die klasse nun mit

    OneWayMsg<TFMain> msg_func(this, &test);
    

    nun bekomme ich folgende fehlermeldung

    [C++ Fehler] Main.cpp(24): E2285 Keine Übereinstimmung für 'OneWayMsg<TFMain>::OneWayMsg(TFMain * const,void (* (_closure )(int))(int))' gefunden
    

    wo hab ich da den fehler ?

    Meep Meep



  • hab den felher jetz gefunden. nun funktioniert es.

    Meep Meep



  • Hallo Meep Meep,

    könntest Du bitte kurz sagen wo der Fehler war? Bastle seit etwa 45 Minuten an Deiner Aufgabenstellung herum und bin in etwa so weit gekommen wie Du in Deinem vorherigen Post warst.

    Danke und viele Grüße
    Knecht



  • Habs auch gefunden. So hats bei mir funktioniert

    class my_class
    {
    public:
        void func(int x)
        {
            std::cout << "In my_class.func: x = " << x << std::endl;
        }
    };
    
    template<class T> class another_class
    {
    public:
        typedef void (T::*t_Func)(int);
        another_class(t_Func t_func) : a_func(t_func) {}
        void RufeAuf(T& r)
        {
            std::cout << "In another_class.RufeAuf ..." << std::endl;
            (r.*a_func)(12);
        }
        t_Func a_func;
    };
    
    int main ()
    {
        my_class an_objekt;
    
        another_class<my_class> ac(&my_class::func);
        ac.RufeAuf(an_objekt);
    }
    

Anmelden zum Antworten