这就是你们用 C 创建“类”的方式吗? 接口怎么样? 我猜我们只是使用函数指针来完成所有事情,并且我们可以更改函数指针指向的位置?
#ifndef CLASS
#define CLASS
void method1() { printf("method #1"); }
void method2() { printf("method #2"); }
typedef struct {
void (*method1)(void);
void (*method2)(void);
} Class;
Class class;
void class_setup()
{
class.method1 = &method1;
class.method2 = &method2;
}
#endif
int main()
{
class_setup();
class.method1();
class.method2();
return 0;
}
要在 C 中创建“类”,您可以使用函数指针,如下所示:
typedef void (*classMethod)(void);
请注意,这里的类型是“classMethod”,并且函数名称不必匹配。所以要使用这个它看起来像
typedef void (*classMethod)(void);
typedef struct {
classMethod method1;
classMethod method2;
} Class;
现在您的方法正确了,您需要在 class_setup 函数中设置它们。在c中,函数名可以有效地被视为该函数的地址,因此这里不需要使用&。它可以只是
class.method1 = method1
(但是你仍然可以说 &method1,如果你更清楚的话,编译器可以使用它)
如果您需要使用“self”或“this”的等效项,则需要传递变量的地址,因为 C 没有任何内置方法来执行此操作。可以使用类似的函数指针
typedef void (*classMethodSelf)(Class *);
来完成。这将被定义为
typedef struct Class Class;
typedef void (*classMethod)(void);
typedef void (*classMethodSelf)(Class *);
struct Class{
classMethod method1;
classMethod method2;
classMethodSelf method3;
};
您会看到类的 typedef 已被移动,这是因为需要在定义之前声明类型,以便将
Class
作为类型传递给函数指针。
如果您不熟悉指向结构的指针,需要注意的另一件重要事情是,将使用 variable->member
而不是 variable.member
访问它的成员。
请注意,更多参数只是像普通函数声明一样在函数指针中声明,但没有变量名称。
如果您想要该方法有一个返回值,只需更改 typedef 中的第一个类型即可。然后就可以像普通功能一样使用它了。
int return5(void){
return 5;
}
typedef struct Class Class;
typedef void (*classMethod)(void);
typedef void (*classMethodSelf)(Class *);
typedef int (*classMethodInt)(void);
struct Class{
classMethod method1;
classMethod method2;
classMethodSelf method3;
classMethodInt methodInt;
};
// (inside main function)
Class class;
class.methodInt = return5;
int x = class.methodInt();
printf("%i\n", x); // 5
如果您有任何问题或需要澄清,请询问,日安。