In dem folgenden Code:initialisieren und Struktur-Parameter gelten Verwendung Funktionszeiger als Strukturelemente
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
int b;
int (*func1)();
int (*func2)();
}STR_X2;
void init(STR_X2 self , int _a , int _b){
self.a = _a;
self.b = _b;
printf("Init a:%d, b:%d \n",self.a,self.b);
}
int multiply(STR_X2 self){
printf("Multiply a:%d, b:%d, res:%d\n",self.a,self.b,self.a*self.b);
return self.a*self.b;
}
int main(void) {
static STR_X2 val2;
val2.func1 = init;
val2.func2 = multiply;
printf("set values of a and b using init() function\n");
val2.func1(val2,3,5);
printf("result:%d\n",val2.func2(val2));
printf("\nset values of a and b directly\n");
val2.a=3;
val2.b = 5;
printf("result:%d\n",val2.func2(val2));
return EXIT_SUCCESS;
}
die Struktur STR_X2
zwei Mitglieder als Funktionszeiger hat.
func1
wird alsinit()
und ses Werte des Parametersa
undb
.func2
wird alsmultiply()
und multipliziert dasa
undb
Durch den Code ausgeführt wird, ich habe folgendes Ergebnis:
set values of a and b using init() function
Init a:3, b:5
Multiply a:0, b:0, res:0
result:0
set values of a and b directly
Multiply a:3, b:5, res:15
result:15
was bedeutet, die Parameter der Initialisierung mit func1()
funktioniert nicht.
Kann mir jemand helfen, herauszufinden, was mit diesem Code nicht stimmt?
Danke
Sie müssen 'STR_X2 *' als Funktionsparameter verwenden oder keiner dieser Code macht den geringsten Sinn. – Lundin
Übrigens verstößt Ihr Code auf schreckliche Weise gegen die grundlegendste Regel von OOP, nämlich die private Kapselung. – Lundin
Wenn Sie 'int (* func)()' ohne Argumente verwenden (d. H. 'Int (* multiply) (int, int)'), ist Ihr Code weniger sicher. Ich würde auch in Betracht ziehen, die "Instanz" innerhalb einer "Klasseninitialisierung" -Funktion zu initialisieren (Ihre "init" -Funktion, aber vielleicht anders benannt). Ich würde auch alle verschachtelten Funktionen 'static' machen, da auf sie nicht von außerhalb der Datei zugegriffen wird, sondern nur über das zugeordnete Objekt. – Myst