2016-07-02 4 views
0

Ich versuche, eine eingebettete Bibliothek für Mikrocontroller in einem (möglicherweise sinnlosen) Versuch zu entwickeln, Geräte generisch zu sein. Im Wesentlichen habe ich eine struct deklariert in der Kopfzeile, genannt CallbackStruct, die eine ganze Reihe von Funktionszeigern für die nachgelagerte Kontrolle eines UART-Objekts (d. H. Die Serial Objekt von Arduinos, nur um eine mögliche Verwendung hinweisen).Speichern von Funktionszeiger von Konstruktor auf private Variable

Das Problem ist, dass ich nicht ganz sicher bin, wie man einen Funktionszeiger (besonders wenn von einer Struktur dereferenziert wird) einem anderen zuordnet, der als private Variable gespeichert wird. Im Wesentlichen brauche ich ein Verständnis der richtigen C++ - Syntax für Funktionszeiger. Hier ist, was ich bisher:

Der Header:

class SomeUARTDevice { 
public: 
    struct CallbackStruct { 
     void (*init) (int); 
     void (*xmit) (char *); 
     int  (*recv) (void); 
     int  (*avbl) (void); 
     void (*flsh) (void); 
     void (*kill) (void); 
    }; 

    SomeUARTDevice (struct CallbackStruct *sc); 

private: 
    void (*init_callback) (int); 
    void (*xmit_callback) (char *); 
    int  (*recv_callback) (void); 
    int  (*avbl_callback) (void); 
    void (*flsh_callback) (void); 
    void (*kill_callback) (void); 
} 

Und dann in der Klasse Quelle:

SomeUARTDevice::SomeUARTDevice (struct CallbackStruct *sc) { 
    init_callback = sc->init; 
} 

Ist dies der richtige Weg, den Funktionszeiger (und wenn nicht zuweisen , wie weit bin ich weg - um ein bisschen oder um eine Meile)?

Beachten Sie, dass, wenn es andere syntaktische Boo-Boos gibt, habe ich dies schnell als Beispiel zusammengeführt, um das Problem ohne das Durcheinander der Haupt-Work-in-Progress zu demonstrieren.

+1

Gibt es einen Grund, warum Sie nicht eine Kopie der Struktur speichern möchte? – OnMyLittleDuck

+1

Ist Ihnen klar, dass Sie virtuelle Funktionen manuell neu implementieren möchten? –

+0

@OnMyLittleDuck Die Struktur ist hauptsächlich so, dass ich nicht alle Funktionszeigerreferenzen in den Konstruktorargumentraum einreihen müsste. Ich nehme an, ich könnte die Struktur direkt aufrufen, aber zum Zeitpunkt des Schreibens hatte ich diese Permutation noch nicht durchgearbeitet. – ecfedele

Antwort

0

Das sieht gut aus. Funktionszeiger funktionieren genauso wie jeder andere Zeiger.

Aber beachten Sie, dass Sie direkt Ihre Mitglieder nicht initialisieren, die Initialisiererliste Konstruktor mit:

SomeUARTDevice::SomeUARTDevice(const CallbackStruct *sc) 
    : init_callback(sc->init) 
    , xmit_callback(sc->xmit) 
    // etc 
{} 
Verwandte Themen