Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用函数指针作为结构成员初始化并应用结构参数_C_Oop_Function Pointers - Fatal编程技术网

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