- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
免责声明:我完全是 C 语言的新手,但我一直在尝试模仿类的某些功能。好的,我知道如果我想走那条路我应该学习 C++,但请考虑以下小实验。
Schreiner 在使用 ANSI-C 进行面向对象编程一书中提出了一种使用指针来获取 C 中的面向对象功能的方法。我必须承认我只是浏览了这本书,但我不太喜欢他的做法。基本上,他使用指向函数的指针来安排
func(foo);
实际调用结果
foo.methods->func();
其中 foo.methods
是一个包含函数指针的结构。在这种方法中,我不喜欢的一点是无论如何都必须具有全局函数 foo
;也就是说,方法不是由它们所在的类命名的。我的感觉是这很快就会导致困惑:想想两个对象 foo
和 bar
,它们都有一个方法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/
尝试获取行星的 body 固定条件,RA、DEC、PM,使用 NASA 的示例。 ftp://naif.jpl.nasa.gov/pub/naif/toolkit_docs/FORTRAN/spice
我是一名优秀的程序员,十分优秀!