Wie verwende ich einen Funktionszeiger in einer C-Struktur?

8

Ich möchte mehr über die Verwendung von Funktionszeigern in C-Structs lernen, um objektorientierte Programmierung zu emulieren, aber bei meiner Suche habe ich gerade Fragen wie dies , wo die Antwort einfach ist, einen Funktionszeiger zu verwenden, ohne zu beschreiben, wie das funktionieren würde.

Meine beste Vermutung ist so etwas

%Vor%

Aber das gibt mir Compilerwarnungen warning: assignment from incompatible pointer type , also mache ich offensichtlich etwas falsch. Könnte jemand bitte ein kleines, aber vollständiges Beispiel dafür geben, wie man einen Funktionszeiger in einer C-Struktur korrekt verwendet?

Mein Unterricht in C erwähnt diese nicht einmal. Ich frage mich, ob diese tatsächlich von C-Programmierern benutzt werden. Was sind die Vor- und Nachteile der Verwendung von Funktionszeigern in C-Strukturen?

    
Eva 14.07.2012, 05:51
quelle

2 Antworten

10

Ändern Sie es in Ihrer Strukturdefinition in

%Vor%

und verwende jetzt den obigen Funktionszeiger in main als

%Vor%     
Andy Stow Away 14.07.2012, 06:08
quelle
12

Die Antwort von Andy Stow Away behebt meine Compilerwarnung, beantwortet aber meine zweite Frage nicht. Die Kommentare zu dieser Antwort von Eddieantonio und Niklas R beantworten meine zweite Frage, aber beheben Sie nicht meine Compiler-Warnung. Also bündle ich sie zu einer Antwort zusammen.

C ist nicht objektorientiert und der Versuch, den objektorientierten Entwurf in C zu emulieren, führt normalerweise zu einem schlechten Stil. Das Duplizieren von Methoden, die Strukturen aufrufen, so dass sie mit einem Zeiger auf die Struktur aufgerufen werden können, wie ich in meinem Beispiel habe, ist keine Ausnahme. (Und ehrlich gesagt, es verletzt DRY.) Funktionszeiger in Strukturen sind für Polymorphie nützlicher. Wenn ich zum Beispiel einen Strukturvektor hätte, der einen generischen Container für eine lineare Sequenz von Elementen darstellt, könnte es nützlich sein, ein comparison_func-Element zu speichern, das ein Funktionszeiger ist, um das Sortieren und Durchsuchen des Vektors zu ermöglichen. Jede Instanz des Vektors könnte eine andere Vergleichsfunktion verwenden. Im Fall einer Funktion, die auf der Struktur selbst operiert, ist es besser, eine einzelne separate Funktion zu haben, die in der Struktur nicht dupliziert ist.

Dies macht die Antwort auf das, was richtig ist, komplizierter. Was ist korrekt, wie ich mein oben genanntes Beispiel kompilieren kann? Wie kann ich mein Beispiel so umformatieren, dass es einen guten Stil hat? Oder ist es, was ist ein Beispiel für eine Struktur, die einen Funktionszeiger verwendet, wie C-Programmierer es tun würde? Bei der Formulierung meiner Frage hatte ich nicht die Antwort erwartet, dass meine Frage falsch war. Der Vollständigkeit halber werde ich ein Beispiel für jede Antwort auf die Frage geben.

Reparieren der Compiler-Warnung

%Vor%

Neuformatierung des Stils

%Vor%

Demonstrieren einer Verwendung für Funktionszeiger in Structs

%Vor%     
Eva 14.07.2012 07:33
quelle