gpt4 book ai didi

c - 用类给 C 加香料

转载 作者:太空狗 更新时间:2023-10-29 16:56:32 24 4
gpt4 key购买 nike

免责声明:我完全是 C 语言的新手,但我一直在尝试模仿类的某些功能。好的,我知道如果我想走那条路我应该学习 C++,但请考虑以下小实验

Schreiner 在使用 ANSI-C 进行面向对象编程一书中提出了一种使用指针来获取 C 中的面向对象功能的方法。我必须承认我只是浏览了这本书,但我不太喜欢他的做法。基本上,他使用指向函数的指针来安排

func(foo);

实际调用结果

foo.methods->func();

其中 foo.methods 是一个包含函数指针的结构。在这种方法中,我不喜欢的一点是无论如何都必须具有全局函数 foo;也就是说,方法不是由它们所在的类命名的。我的感觉是这很快就会导致困惑:想想两个对象 foobar,它们都有一个方法func 但具有不同数量的参数。

所以我尝试了一些更符合我口味的东西。第一次尝试如下(为了简洁起见,我省略了声明)

#include <stdio.h>

//Instances of this struct will be my objects
struct foo {
//Properties
int bar;

//Methods
void (* print)(struct foo self);
void (* printSum)(struct foo self, int delta);
};

//Here is the actual implementation of the methods
static void printFoo(struct foo self) {
printf("This is bar: %d\n", self.bar);
}

static void printSumFoo(struct foo self, int delta) {
printf("This is bar plus delta: %d\n", self.bar + delta);
}

//This is a sort of constructor
struct foo Foo(int bar) {
struct foo foo = {
.bar = bar,
.print = &printFoo,
.printSum = &printSumFoo
};
return foo;
}

//Finally, this is how one calls the methods
void
main(void) {
struct foo foo = Foo(14);
foo.print(foo); // This is bar: 14
foo.printSum(foo, 2); // This is bar plus delta: 16
}

这很不方便,但有点管用。不过,我不喜欢的是您必须明确地将对象本身添加为第一个参数。通过一些预处理器工作,我可以做得更好:

#include <stdio.h>
#define __(stuff) stuff.method(* stuff.object)

//Instances of this struct will be my objects
struct foo {
//Properties
int bar;

//Methods
//Note: these are now struct themselves
//and they contain a pointer the object...
struct {
void (* method)(struct foo self);
struct foo * object;
} print;
};

//Here is the actual implementation of the methods
static void printFoo(struct foo self) {
printf("This is bar: %d\n", self.bar);
}

//This is a sort of constructor
struct foo Foo(int bar) {
struct foo foo = {
.bar = bar,
//...hence initialization is a little bit different
.print = {
.method = &printFoo,
.object = &foo
}
};
return foo;
}

//Finally, this is how one calls the methods
void
main(void) {
struct foo foo = Foo(14);
//This is long and unconvenient...
foo.print.method(* foo.print.object); // This is bar: 14
//...but it can be shortened by the preprocessor
__(foo.print); // This is bar: 14
}

这是我所能得到的。这里的问题是它不适用于带参数的方法,因为预处理器宏不能接受可变数量的参数。当然可以根据参数的数量定义宏_0_1等(直到厌倦为止),但这不是一个好的方法。

Is there any way to improve on this and let C use a more object-oriented syntax?

我应该补充一点,实际上 Schreiner 所做的比我在他的书中所说的要多得多,但我认为基本结构没有改变。

最佳答案

各种框架已经存在。参见例如 http://ldeniau.web.cern.ch/ldeniau/html/oopc.html

关于c - 用类给 C 加香料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4733427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com