用 C 创建类

问题描述 投票:0回答:1

这就是你们用 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 class
1个回答
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

如果您有任何问题或需要澄清,请询问,日安。

© www.soinside.com 2019 - 2024. All rights reserved.