Funktionspointer übergeben



  • Hallo Leute,

    habe zwei Klasse die wie folgt aussehen:

    class B {
    public:
      B(/* hier kommt der Funktionspointer rein*/){
        // irgend welcher Code
        // Hier dann der aufruf A::barA
      }
      ~B(){}
    };
    
    class A {
    public:
      A(){}
      ~A(){}
      void fooA () {
         B *b = new B(/* übergebe ich den Aufruf A::barA */);
      }
      void barA ( int a ) {
         // Do something
      }
    };
    

    Klasse A wird irgendwann mal ein Objekt der Klasse B erstellen und soll ihm nun den Funktionspointer "barA" übergeben damit die Klasse B den irgend wann mal aufrufen kann.

    Das besondere daran soll halt sein, dass die Klasse B nicht ausdrücklich einen Funktionspointer von A annehmen soll, sondern irgend ein Funktionspointer von einer X beliebigen Klasse.

    Also ich müsste da mit Templates arbeiten, aber finde kein Ansatz wie ich das realisieren soll.

    Gruß
    Slux



  • #include <iostream>
    using namespace std;
    
    template<typename T>
    class B
    {
    	public:
    		B(void (T::*ptmf)(int))
    		{
    			A a;
    			(a.*(ptmf))(123);
    		}
    		~B() {}
    };
    
    class A
    {
    	public:
    		A()  {}
    		~A() {}
    		void fooA ()
    		{
    			B<A> *b = new B<A>(&A::barA);
    			delete b;
    		}
    		void barA ( int a )
    		{
    			cout << a;
    		}
    };
    
    int main()
    {
    	A a;
    	a.fooA();
    }
    

    Allerdings sieht das Ganze sehr merkwürdig aus und ich habe keinen blassen Dunst, was du damit überhaupt erreichen willst. 😕



  • EDIT:
    out's Quelltext nicht richtig gelesen - sorry.

    class B {
    public:
      B(std::function< void (int) > func){
        // irgend welcher Code
        func(123);
      }
      ~B(){}
    };
    
    class A {
    public:
      A(){}
      ~A(){}
      void fooA () {
         B *b = new B(std::bind(&A::barA, this, _1));
      }
      void barA ( int a ) {
         // Do something
      }
    };
    


  • Ich habe das Prinzip stark vereinfacht von dem was ich da gerade habe und deswegen wirkt es etwas komisch.

    Hab das Problem noch auf eine andere Art und Weise gelöst - ich habe mit signals gearbeitet, boost::signal bzw sigc::signal, damit kann man etwas komplexer arbeiten.


Anmelden zum Antworten