Zugriff auf Funktionen in Funktionszeiger Array



  • Hallo zusammen

    Mein erster post hier, ich hoffe ihr könnt mir helfen.

    Ich habe da also eine Klasse mit einem Funktionszeiger Array als Member

    class KlasseX : AbgeleitetVonW
    {
    public:
        KlasseX();
        void (*_pFuncArr2[10])(Packet* packet);
        void DoSomething(Packet* packet);
        void DoSomething2(Packet* packet);
    };
    

    Diese Funktionen kann ich im Konstruktor auch zuweisen

    KlasseX::KlasseX()
    {
       _pFuncArr2[0] = &KlasseX::DoSomething;
       etc...
    }
    

    In einer anderen Klasse habe ich nun einen Zeiger auf diese KlasseX und will eine Funktion aus diesem Array aufrufen. Dies tu ich wie folgt:

    _pKlasseXZeiger->*_pFuncArr2[0](p);
    

    Dies gibt mir jedoch einen Compile Fehler:

    "error C2065: '_pFuncArr2' : undeclared identifier"

    Gelesen habe ich jedoch dass dies eigentlich richtig sein sollte?
    Kann mir da jemand weiterhelfen?
    Wäre äusserst dankbar 😃 !!!



  • Folgendes sollte funktionieren. Ich denke das Konzept in Kombination mit Klassen zu verwenden ist nicht sonderlich schwerer. Wenn dennoch Probleme bestehen kann ich dazu auch noch ein weiteres Beispiel geben.

    #include <iostream>
    using namespace std;
    
    template <class T>
    struct exec_
    {
      void operator()(T v) {
        if (v)
          v();
      }
    };
    
    void f1()
    {
      cout << "f1()\n";
    }
    
    void f2()
    {
      cout << "f2()\n";
    }
    
    void f3()
    {
      cout << "f3()\n";
    }
    
    int main()
    {
      typedef void (*func_ptr)(void);
      func_ptr v[3];
      v[0] = &f1;
      v[1] = &f2;
      v[2] = &f3;
    
      for_each(v, v+3, exec_<func_ptr>());
    }
    


    class KlasseX 
    { 
    //...
    	void (KlasseX::*_pFuncArr2[10])(Packet* packet); 
    //...
    };
    
    (p->*_pFuncArr2[0])(p);
    

  • Mod

    ssm schrieb:

    (p->*_pFuncArr2[0])(p);
    
    (p->*p->_pFuncArr2[0])(p);
    

    😉



  • Danke schonmal für die Antworten

    Ich habe nun also KlasseX korrigiert...

    class KlasseX : AbgeleitetVonW
    {
    public:
        KlasseX();
        void ([b]KlasseX::*_[/b]pFuncArr2[10])(Packet* packet);
    };
    

    Dieser Aufruf

    (p->*_pFuncArr2[0])(p);
    

    führt allerdings immernoch zum selben Fehler.

    Dieser Hier

    (p->*p->_pFuncArr2[0])(p);
    

    führt zu folgendem Fehler:

    error C2064: term does not evaluate to a function taking 1 arguments

    Die Lösung von lucky_tux müsste ich noch aussprobieren, allerdings sollte es doch auch so gehen!!!



  • (p->*(p->func[0]))(10);
    

    Allerdings schluckt es der VC++2005 auch so wie camper es vorgeschlagen hat (und der muss es wissen, der hat den Standard verinnerlicht :D), also vermute ich Dein Compiler hat ne Macke.



  • camper schrieb:

    (p->*p->_pFuncArr2[0])(p);
    

    😉

    ja genau :p

    renderflash schrieb:

    führt allerdings immernoch zum selben Fehler.

    glaube ich nicht 🙄

    struct Packet{}; 
    
    class KlasseX 
    { 
    public:
        KlasseX()
        {
           _pFuncArr2[0] = &KlasseX::foo;
           _pFuncArr2[1] = &KlasseX::foo2;
        }
    
        void (KlasseX::*_pFuncArr2[10])(Packet* packet); 
    
    private:
        void foo(Packet* packet);
        void foo2(Packet* packet);
    }; 
    
    int main()
    {
      KlasseX *dummy = 0;
      Packet *packet = 0;
      (dummy->*dummy->_pFuncArr2[0])(packet);
    }
    
    Your Comeau C/C++ test results are as follows: 
    
    Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
    Copyright 1988-2003 Comeau Computing.  All rights reserved.
    MODE:strict errors C++
    
    In strict mode, with -tused, [b]Compile succeeded [/b](but remember, the Comeau online compiler does not link).
    

Anmelden zum Antworten