如何在C中默认初始化类成员函数?

stszievb  于 2023-04-29  发布在  其他
关注(0)|答案(3)|浏览(104)

我用C实现了一个类似于C中的类的数据结构。
但是我发现每当类包含成员函数时,那么我每次都要手动将类成员函数指向代码中的特定函数。
而在C
中,不需要将成员函数指向任何人,因为C++直接在类中实现成员函数。
就像这样:
C:

typedef struct {
    // declare func as pointer to function returning void
    void (*func)();
} ClassTest;

// Example Function
void func_1()
{
    printf("test done.\n");
}

int main()
{
    ClassTest obj;

    // You must manually point the function pointer in
    // the structure body to this function.
    obj.func = func_1;

    obj.func(); // call function
    return 0;
}

C++

// Classes with the same functionality in C++
class ClassTest {
    public:
        void func() {
            printf("test done.\n");
        }
};

ClassTest obj = ClassTest();
obj.func();

有没有一种方法可以让C像C++一样默认初始化成员函数,而不必手动指向它们?

7kjnsjlb

7kjnsjlb1#

通过使用“模板”对象,初始化test_ctx的每个示例变得容易得多。
如果你曾经更新过test_ctx类型(也许是通过添加更多的函数),你只需要更新模板,对象的所有其他示例(下面的objobjB)都会自动更新,因为它们都是从模板中复制的。

#include <stdio.h>
typedef struct {
    void (*func)();
} test_ctx;

void func_1()
{
    printf("test done.\n");
}

// Create a "template" to copy from for new objects
// const makes it more difficult to accidentally change the template.
const test_ctx tmpl_test_ctx = { .func = func_1 };

int main(void)
{
    test_ctx obj = tmpl_test_ctx;  // Use the template to initialize a new object
    test_ctx objB = tmpl_test_ctx; // Every new object must be initialized from the template.
    
    obj.func();  // Now the object is ready to use
}
2ic8powd

2ic8powd2#

使用功能?
就像这样:

typedef struct {
    uint8_t *src, *dst;
    size_t srcSize, dstSize;
    size_t (*snB64E_size)(snSize srcSize);
    size_t (*snB64D_size)(snByte *src, snSize srcSize);
    void   (*snBase64Encode)(snByte *dst, snByte *src, snSize srcSize);
    void   (*snBase64Decode)(snByte *dst, snByte *src, snSize srcSize);
} ctx;

void malloc_init(ctx **obj)
{
    if(!(*obj)) {
        (*obj) = (ctx *)malloc(sizeof(ctx));
    }
    (*obj)->snBase64Encode = snBase64Encode;
    (*obj)->snBase64Decode = snBase64Decode;
    (*obj)->snB64E_size = snB64E_size;
    (*obj)->snB64D_size = snB64D_size;
}

int main()
{
    ctx *obj = (ctx *)malloc(sizeof(ctx));
    malloc_init(&obj);
    return 0;
}
0lvr5msh

0lvr5msh3#

除了“template object”和“init function”,你还可以定义一个宏:

#define INIT_CTX { .func = func1 }

然后像这样使用它:

test_ctx obj_1 = INIT_CTX;
test_ctx obj_2 = INIT_CTX;

相关问题