Benachrichtigung einer Verarbeitungsklasse durch die Schnittstellenklasse, wenn Daten da sind?
-
Hallo,
ich habe ein kleines Problemchen, das aus meiner Sicht auch nicht in anderen Forumsbeiträgen beehandelt wird.
ich habe eine Klasse, die eine Schnittstelle überwacht. Die DAten, die irgendwann empfangen werden, sollen weiterverarbeitet werden. jetzt möchte ich die Ververarbeitung in einer anderen Klasse machen, um die Schnittstelle gut zu kapseln und wiederverwendbar zu machen.
Nach ein wenig Recherche glaube ich, dass ein möglicher Ansatz der mit Funktionszeigern ist.
Meine Frage ist nun ob das der beste Ansatz ist oder ob es da nicht was viel schlaueres gibt und was bei meinem jetztigen Versuch mit Funktionszeiger falsch ist. Dazu hier der Code.Die Klasse zu Überwachung der Schnittstelle. Die Daten werden nachdem sie empfangen werden in m_RecieveBuffer geschrieben. Die Daten und die Länge der Daten m_RecieveBufferSize will ich dann an die Funktion pt2Function irgendwie übergeben, die aus einer anderen Klasse stammt.
class CPort{ public: typedef void(*pt2Fn) (unsigned char* , unsigned long ); pt2Fn pDataReceived = 0; void SetDataRecievedFnPointer(pt2Fn pt2Function){ pDataReceived = pt2Function; } void DoDataRecieved(void){ if (pDataReceived) pDataReceived(m_RecieveBuffer, m_RecieveBufferSize); } private: unsigned char *m_RecieveBuffer; unsigned long m_RecieveBufferSize; };Wäre schön, wenn sich jemand meldet, da ich mich irgendwie im Kreis drehe.
Vielleicht auch direkt am Beispiel, da ich sowas einfach verstehe. Danke
-
Übergibt doch einfach statt eines Funktionszeigers einen Zeiger auf die zu verarbeitende Klasse:
class CPort { ... void setWorkerClass(WorkerClass &c) { m_worker = &c; }; WorkerClass *m_worker; void DoDataRecieved(void){ assert(m_worker != NULL); // remember to set worker class! if (pDataReceived) m_worker->process(m_RecieveBuffer, m_RecieveBufferSize); } }; class WorkerClass{ public: void process(unsigned char*, unsigned long){ /*do the work here*/ }; }Hoffe das hilft.
-
werde ich gleich mal ausprobieren,
wenn ich mir das BEispiel so angucke, fällt mir auf, dass ich dann doch immer die Schnittstellen klasse anpassen muß, wenn ich sie wiederverwenden will. Oder seh ich das falsch??Am Liebsten wäre es mir, wenn man die Klasse nicht mehr anfassen müsste, aber wie gesagt. ich probier das mal aus und wenn´s klappt, mach ich´s halt so.
Gruß
-
ich habe noch eine andere Frage zu dem Beispielcode.
wie komm ich denn an die übergebenen Variablen heran oder ist das ein Schreibfehler, da sie so ja keinen Namen haben, oder?