c类函数

标签 c class

好吧,对于你们中的许多人来说,这可能是一个愚蠢的问题。 让我按照我在过去 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/

相关文章:

c++ - 通过重新排序优化分支

c - 只有两次比较的迭代二分查找?

c - C 中的数据类型和数据类型修饰符

PHP 如何获取带有类和命名空间路径的方法名称作为字符串?

c++ - 是否为每个 C++ 对象编译了多个成员函数?

javascript - 使用 JQuery 更改 css 类内容

c - 基于链表的 Infix 计算器中的错误

c - 套接字编程 : sendto always fails with errno 22 (EINVAL)

class - 当必需的属性是有条件的且值仍为空时,Angular2 将 ng-valid 类应用于字段

python:使用一个类来跟踪另一个类使用的数据