Path: csiph.com!news.swapon.de!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Hans-Peter Diettrich Newsgroups: de.sci.electronics Subject: Re: C++ method pointer? Date: Thu, 10 Mar 2016 16:33:55 +0100 Lines: 51 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 8bit X-Trace: individual.net nHhSzbruu4tiOrDax5gy6gkQtlEV+N7FaqFdX6lUiDXV4mf0gU Cancel-Lock: sha1:Ac9F3wDf2Hwwji44Qo5a3/VBIa4= User-Agent: Thunderbird 2.0.0.21 (Windows/20090302) In-Reply-To: Xref: csiph.com de.sci.electronics:203983 Edzard Egberts schrieb: > Hans-Peter Diettrich wrote: >> Problem: eine Klasse implementiert mehrere (gleichartige) Methoden, von >> denen eine bestimmte zur Laufzeit aufgerufen werden soll. Leider sind >> meine C++ Kenntnisse sehr angestaubt, ich komme nicht drauf wie sich das >> mit einem Methoden-Pointer erledigen läßt :-( >> (Singleton) > > Ein Singleton kann eigentlich komplett statisch sein, so dass Du die > einfacheren C-Funktionspointer verwenden kannst, indem Du die Methoden > static definierst und ggf. einen this-Pointer auf Deine Instanz übergibst: In diesem Fall würde ich die Instanz ganz wegoptimieren. Bislang werden die zugehörigen Daten in 3 Strukturen gespeichert, eine statische für den Interrupt-Handler, eine für das dekodierte Ergebnis (Parameter), und dann noch die Klasse selbst. Das Ergebnis habe ich momentan bereits in die Klasse integriert, es könnte aber auch komplett global werden und auch die Elemente der Klasse enthalten. [...] > int main() > { > IRrecv irrecv; > irrecv.read(IRrecv::decodeNEC); Hier stört mich noch der aufwendige Parameter (Tippfehler!), dafür sollte ich wohl noch Makros definieren. > Die Dekoder-Funktionen müssen dann noch nicht einmal Methoden sein, > sondern können extern definiert werden. Die Klasse könnte man so auf ein > Datenobjekt beschränken, das die Parameter für die Dekoder enthält. Das war auch meine erste Idee. Doch dann habe ich mich für die Beibehaltung der Klasse entschieden, mit den Standard-Methoden begin(), available() und read(), die jeder Arduino Programmierer von den anderen Stream-Klassen gewohnt ist. > Eine echte C++-Lösung wäre dagegen die Verwendung eines Interface, mit > dem sich die Funktionen als Objekt handhaben lassen: Dagegen spricht die universelle decode() Methode, die alle verfügbaren Dekoder durchprobiert, und die weiterhin nutzbar sein sollte. Die müßte dann auf Instanzen aller abgeleiteten Klassen zugreifen, mit höherem Speicherbedarf (zumindest bei den VMT). Vielen Dank für die ausführlichen Codechnipsel :-) Zumindest weiß ich jetzt, was für eine Sorte Pointer ich brauche, und hoffe, daß ich nun auch die Lücken im ursprünglichen Beitrag richtig füllen kann. DoDi