好吧,对于你们中的许多人来说,这可能是一个愚蠢的问题。 让我按照我在过去 10 年中学习的语言的顺序列出一个列表作为序言。 [顺便说一句,我了解其中一些是脚本语言]
- vb 6.0
- html
- asp
- php
- CSS
- JavaScript
- 托管 C++
- c#
- C++
- C
- ASM
是的,我知道我是从完全相反的一端开始的,但希望这份 list 能让我免于因为这个而受到太多批评,呵呵。
问题:普通旧 C 中是否有类...我知道有结构... 另外我想知道你是否可以在 C 结构/类中声明函数(如果它们存在)。 我认为两者的答案是否定的,但是很难在互联网上找到关于普通 C 的信息,因为大多数东西都是针对 C++ 的。此外,我有兴趣了解有关使用 C 的任何提示、技巧或警告。在此先感谢您。
顺便说一句:出于可移植性和速度的目的,我对 C 感兴趣。
最佳答案
C 中的类通常由结合了函数指针的结构来模拟。非虚函数可以与指向结构的指针一起传递,如下所示:
int obj_compare_funct(Obj *a, Obj *b);
int result = compare_two_objects(obj1, obj2, obj_compare_func);
但是当您将指针嵌入到结构中时,真正的乐趣就开始了;这意味着同一整体“类”的对象可以有不同的“方法”。最大的语法缺点是指向的函数不会自动知道它正在为哪个对象调用。所以对象也需要被传递,这使得输入比通常需要的多一些。例如:
/***** In the animal.h header file. *****/
typedef struct Animal {
char *name;
void (* speak)(Animal *this); /* The speak "method" */
} Animal;
/* Constructors for various animal types. Implementation detail: set the animal's speak method to the appropriate one for that animal type. */
extern Animal *make_feline(char *name);
extern Animal *make_rodent(char *name);
/***** Somewhere in zoo.c, which #includes animal.h. *****/
Animal *cat = make_feline("Tom");
Animal *mouse = make_rodent("Jerry");
cat->speak(cat); /* Print "Tom says meow!" */
mouse->speak(mouse); /* Print "Jerry says squeak!" */
这个例子比 Java 等语言提供的继承模型要宽松一些——一个 Animal 实例可以有任何行为,而不是依赖于它的子类的一组特定行为中的一个。为了使事情更严格一些,这些方法通常被组合到一个称为 vtable(虚函数表)的结构中。为每个子类型预先创建一个 vtable,并从实例中指向适当的 vtable。
请注意,这些都不能直接帮助您为每个子类型设置不同的字段——这比较棘手(尤其是在语法上),并且可以通过将对象转换为其第一个成员的技巧来完成,例如:
/* Can be treated as an Animal if you cast its pointer. */
typedef struct Cat { Animal super; int num_fleas; } Cat;
或者使用不透明指针,例如
typedef struct Animal { char *name; void *species_specific_data; } Animal;
额外字段将隐藏在 void *
指针后面,并可通过该物种特有的方法访问。
关于c类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1892183/