Für dieses spezielle Beispiel, was Sie wirklich wollen, scheinen die Fähigkeit, einen Funktionszeiger zu haben, die auf zwei verschiedene Funktionen verweist, ein Fliegen und ein zu implementieren, die nicht fliegen implementiert.
Also wäre der Ansatz, den ich betrachten würde, etwas wie das Folgende. Ich habe nicht versucht, diesen Code tatsächlich zu kompilieren, aber der Sinn dafür ist richtig.
Auch in Ihren Kommentaren haben Sie erwähnt, dass das Ändern des Funktionszeigers verhindert wird. Sie können etwas wie das Folgende tun, wo ein const
der Strukturdefinition für den Funktionszeiger hinzugefügt wird und dann einen Klon der Struktur mit einem Cast verwendet.
Header-Datei flying.h Inhalt.
typedef struct _TAG_Being {
int (* const printFlying)();
} Being;
Being * new_flyingThing();
Being * new_Thing();
Implementierung oder flying.c-Datei.
#include "flying.h"
static int printFlyingThing()
{
printf (" I am a flying thing\n");
return 0;
}
static int printThing()
{
printf (" I am a thing\n");
return 1;
}
// use the same layout and members as Being above.
typedef struct {
int (* printFlying)();
} BeingX;
Being * new_flyingThing()
{
BeingX *p = malloc(sizeof(BeingX));
p->printFlying = printFlyingThing; // use the flying thing function
{
Being *q = (Being *)p;
return q;
}
}
Being * new_Thing()
{
BeingX *p = malloc(sizeof(BeingX));
p->printFlying = printThing; // use the not flying thing function.
{
Being *q = (Being *)p;
return q;
}
}
Main oder mit C-Datei
#include "flying.h"
int main(){
Being * flyingThing = new_flyingThing();
Being * thingThatCantFly = new_Thing();
flyingThing->printFlying(); /* "I'm flying!" */
thingThatCantFly->printFlying(); /* "I can't fly!" */
}
Wenn Sie eine Notwendigkeit, die tatsächliche Being
Objekt oder eine Variable in der printFlying()
Funktion zuzugreifen, dann müssen Sie es als ein Argument zu übergeben.
Zum Beispiel:
typedef struct _TAG_Being {
int xx;
int (*printFlying)(struct _TAG_Being *p);
} Being;
Dann würden Sie so etwas wie benötigen:
Being * flyingThing = new_flyingThing();
flyingThing->printFlying(flyingThing); /* "I'm flying!" */
C ist nicht Java. Es scheint, dass Sie versuchen, OOP in C zu verwenden, für das es nicht vorgesehen ist. –
Sie müssten 'printFlying 'einen Parameter geben, der Zeiger auf das Objekt in Frage –
@ John3136 Ich habe bereits die Antworten in dieser Frage gelesen, und sie beantworten meine Frage nicht: Die meisten von ihnen verwenden Dinge wie' Funktion (struct ...) 'um dies zu tun, während die Funktion keine Parameter annehmen soll (' struct ... -> function() '). – csTroubled