C 使用函数指针作为结构成员初始化并应用结构参数
在以下代码中:C 使用函数指针作为结构成员初始化并应用结构参数,c,oop,function-pointers,C,Oop,Function Pointers,在以下代码中: #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
#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;
}
这意味着使用
func1()
初始化参数无效有人能帮我找出这个代码有什么问题吗?
谢谢你在
init
中按值取STR_X2,然后乘
-这会导致复制。用指针修改您在main
中声明的static
实例,您需要使用STR_X2*
作为函数参数,否则这些代码都毫无意义。顺便说一句,您的代码严重违反了OOP的最基本规则,即私有封装。使用int(*func)()
如果没有参数(即int(*multiply)(int,int)
),您的代码就不太安全。我也会考虑在“类初始化”函数中初始化“实例”(您的代码> init < /Cult>函数,但可能以不同的方式命名。我还将使任何嵌套函数都是静态的
,因为它们不是从文件外部访问的,所以只能通过分配的对象访问它们。。。此外,非法的函数指针转换是完全未定义的行为,很可能导致大多数系统上的程序崩溃。很抱歉发送了这么多评论,但您真的应该从头开始重新编写整个代码。(*func)(
没有参数,因为其中一个参数的类型为STR_X2
,此时未定义。你知道我应该如何添加参数吗?
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