Ich habe einfache C++ Wrapper-Klassen erstellt, aber mein aktuelles Problem ist ein wenig verwirrend. Ich habe eine benutzerdefinierte Hardware, die an einen USB-Port angeschlossen werden kann und bestimmte Informationen abhängig von der Konfiguration der Hardware gibt, auf der verschiedene Event-Handler ausgeführt werden. Es verwendet Ethernet-über-USB-Protokoll. Der C-Code auf der PC-Seite sieht wie folgt aus:Wie erstellt man eine C++ - Wrapper-Klasse für die folgende Art von C-Programm?
// Relevant headers
int Event1handler(){
// Code to process event 1
}
void Event2handler(){
// Code to process event 2
}
int main(void){
// Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods
}
Jetzt bin ich verwirrt, wie eine C++ Klasse um den obigen Code zu wickeln. Im C-Programm werden die Event-Handler automatisch aufgerufen, je nachdem, welche Informationen vom USB kommen. Wie würde ich die Event-Handler als Methoden einer Klasse implementieren, die automatisch aufgerufen werden, abhängig von den Informationen, die die Hardware sendet? Kann ich den Inhalt der Funktion main() in den Konstruktor der Klasse einfügen?
Edit: Ich brauche keine separaten Methoden für die Klasse. Ich muss nur das C-Programm in eine Klasse einpacken. Es ist auch in Ordnung, alle Event-Handler in eine einzige Methode einzufügen (wenn es überhaupt möglich ist). Ich brauche nur die Daten, die jeder Event-Handler erhält.
Edit2: Hier ist, was die eigentlichen Event-Handler und Anrufe aussehen wie Opensound mit:
// Relevant headers
int Event1handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){
// Code to process event 1
}
void Event2handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){
// Code to process event 2
}
int main(void){
// Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods
lo_server_thread st;
// "if" means one integer and one float
lo_server_thread_add_method(st, "/folder/data1", "if", Event1handler, NULL);
lo_server_thread_add_method(st, "/folder/data2", "if", Event2handler, NULL);
}
Ich kenne Open Sound Control überhaupt nicht, aber viele C-basierte Callback-Systeme (insbesondere GUI) können in einer Klasse zusammengefasst werden. Die Callback-Funktionen sind statische Elementfunktionen. Diese Rückrufe akzeptieren normalerweise einen Zeiger auf benutzerdefinierte Daten. Wenn Sie den Callback im Konstruktor des Objekts einrichten, würden Sie "this" als diese Daten übergeben. Der Callback würde den Zeiger zurück in den Klassentyp konvertieren, dann eine Mitgliedsfunktion aufrufen, um die eigentliche Arbeit zu tun, und irgendwelche zusätzlichen Daten übergeben, die dem Callback übergeben wurden. Ich hoffe, das hilft. –
Danke für den Tipp. Ich fühle es ziemlich relevant. Ich werde nur ein bisschen mehr Code zu meinem Beitrag hinzufügen, so dass Sie sehen können, wie OpenSoundControl funktioniert und wenn Sie denken, dass Ihre Idee anwendbar ist, veröffentlichen Sie bitte einen Beispielcode. – user1420