Array von Methoden



  • Hallo zusammen,

    Folgender Fall:
    Ich habe unzählige Klassen mit unterschiedlichen Konstruktoren und Methoden. Allen gemeinsam sind Methoden mit selben Namen und selben Parametern.
    z.B.

    class a
    {
    public:
      a() { 
        //tu was
      }
      void senden( unsigned char data ) {
        //Datenaufbereitung
      }
    };
    
    class b
    {
    public:
      b( int wert ) { 
        //tu was
      }
      void senden( unsigned char data ) {
        //Datenaufbereitung
      }
    };
    

    Nun hab ich eine weitere Klasse, die alle gleichnamigen Methoden aufrufen soll

    class transmit
    {
    public:
      void transmitData( ??? ) {
        for( i = 0 ; i < 2 ; i++ ) {
          ?????.senden( i );
        }
      }  
    };
    

    wie kann ich in meiner Hauptroutine ein Array definieren, bei der die Einsprungpointer der gleichnamigen Methoden hinterlegt sind? und wie übergebe ich dann dieses meiner Methode in der Klasse transmit?

    Ich hab schon das (gefühlt ganze) Internet durchsucht. Warscheinlich mit den falschen Suchbegriffen, komm aber auf keine Lösung.
    Auch virtuellen Funktionen hab ich schon versucht, scheitert aber daran, dass die Konstruktoren unterschiedlich sind. Und dann ist jede Klasse noch in einem eigenem sourcefile.



  • Hängt etwas davon ab was du erreichen möchtest. Die Klassen von einer gemeinsamen Basisklasse ableiten kling schon mal nach ner guten Idee. Dazu müssen die Konstruktoren und anderen Methoden der Klassen nicht gleich sein. Wenn du diverse unterschiedliche Methoden speichern möchtest, die sich nur durch die Signatur gleichen wäre eventuell noch std::function eine Möglichkeit.



  • Dein Beispiel sieht eigentlich so aus als bräuchtest du nur eine gemeinsame Basisklasse, in etwa so:

    class base
    {
    public:
    
      virtual void senden( unsigned char data ) = 0;
    };
    

    Dann kannst du senden in allen abgeleiteten Klassen so implementieren wie du möchtest, oder übersehe ich da etwas?



  • Ich wollte mir eine Library mit verschiedenen Übertragungsfunktionen zusammenstellen (Anzahl weiter wachsend).
    Dabei lassen sich verschiedene Sendefunktionen hintereinander setzen. Daher das Array.
    Damit ich eben nicht bei jeder Anwendung die Library anfassen muss, sollte alles so modular wie möglich sein. Allen gemeinsam sind aber dann die 4 eigentlichen Sendefunktionen.

    Ich hab das mit den virtuelle Funktionen schon probiert.
    Jedoch hab ich dann versucht das ganze in ein Array zu pressen. Nur mit welchen Typ definiere ich das Array. Wenn ich base als Typ verwende bekomme ich:

    error: invalid abstract type 'base' for 'sendenArray'
    

    Langsam hab ich einen Knopf im Hirn 😞



  • std::vectro<base*> x;
    


  • Jetzt beherrscht mein gcc für ATMEGA keine templates

    error: expected constructor, destructor, or type conversion before '<' token
    


  • Wenn du exakt das genutzt hast was Manni geschrieben hast, dann bsit du auf dem Holzweg, denn der hat sich vertippt, es heisst

    std::vector<Base*>
    


  • Richtig, aber soweit hatte ich mir das schon zusammengereimt.
    Leider unterstützt der ATMEGA-gcc diese C++ Version nicht.



  • std::vector ist wohl auch nicht das ganz richtige für den Atmega. Es geht aber auch ein normales Array, aber dann ist eben die Größe fest.

    Base* x[2];
    


  • Auf so'n simplen System wuerde ich eher zu Funktionpointern tendieren, einfach wieder in einem Array fester Groesse hinterlegt. Wenns nicht performancekritisch ist, gehts mit virtuellen Funktionen aber auch.



  • Ich hab's nun anders gelöst.

    Ich lege Pointer auf die Methoden in einem Array ab.

    Damit kommt der Kleine auch wunderbar zurecht.



  • Do it like '85. Weitere Infos gibts uebrigens unter folgendem Begriff "Sprungtabelle":
    https://de.wikipedia.org/wiki/Sprungtabelle



  • Eine Sprungtabelle mit switch/case aufbauen?
    Da müßte ich jedesmal die Bibliotheksfunktionen ändern, wenn ich ein anderes System zusammenstellen will.
    So hab ich nur ein Array, dass ich der Biblithek übergebe und gut.
    Ich hab bisher noch nicht die Notwendigkeit, das letzte Quantchen Speed herauszuholen. Ist noch relativ viel Luft.



  • Wir waere es eine Sprungtabelle ohne switch und case aufzubauen? Das Array _ist_ eine Sprungtabelle. Ich dachte dich interessieren vielleicht die Hintergruende.



  • Ich kenn das ja noch aus den Zeiten wo ich noch 8080 in Assembler programmiert hab. 😉 😋 👍


Log in to reply