我被要求实现一个“带有类的 C 程序”。 C有课吗,还是有什么误会?
不,C 没有类。也就是说,有一些方法可以用 C 语言模拟面向对象编程 - 快速 Google 搜索应该会产生一些有用的结果。
不,C 本身没有类,只有 C++(当时是“带类的 C”......)。但是您可以在 C++ 代码中使用标准 C 库,即使它通常不被认为是良好实践(其中 C++ 有自己的更高级别的构造,例如
cout
与 printf
)。
您也可以模拟 C 中的类、继承和虚函数的行为,但这不值得这么痛苦。
你可能应该给你的前同学买一本 C 编程书:-)
C 没有类的正式构造。您可以使用模块级数据(根据您自己的协议,您不会在其他任何地方使用这些数据)或静态数据来生成模块,并编写函数来获取、设置和以其他方式操作该数据。您甚至可以使用函数指针来操作类似的数据类型,就像它们在类中一样。
但是,您不会受到 C 编译器的类语义或其他规则的保护,因为 C 编译器不了解类。然而,结构化数据非常强大。
C 没有类。
但是可以通过使用静态全局变量作为私有类成员,使用静态函数作为私有成员函数来近似一个类。外部成员作为公众。在这种情况下,整个文件可以被视为一个类。
这可能不是你想要的。
C 不支持类,但我们确实有棘手的 hacky 解决方法。阅读完整说明或只需向下滚动到代码部分。
我声明了一个名为
class的
struct
。在里面,我放置了未初始化的 function
,类型为 void,名称为 Print 和一个参数 char。
这看起来像void class.Print(char);
但是struct不允许初始化内部变量。所以我们将在外面初始化它。我们创建了一个类型为
class的
function
,名称为 Printer。它初始化了 struct
并返回我们可以轻松使用的初始化结构。
现在我们包含了辅助头和声明的变量,其类型为
class
,名称为 printer1
,值为 Printer()
。在我调用类成员并使用 printer1.Print("Hello from class function");
打印字符串之后
main.c
#include "helper.h"
void main()
{
class printer1 = Printer();
printer1.Print("Hello from class function");
}
helper.h
#include <stdio.h> //imports int printf(...);
void print(const char* text)
{
printf(text);
}
typedef struct
{
void (*Print) (const char*);
} class;
class Printer()
{
class Printer;
Printer.Print = &print;
return Printer;
}
注:
class
是示例名称。您也可以使用任何其他名称。这似乎是需求冲突的典型案例:-)
她的需求的术语CLASS、CONSTRUCTOR、METHOD都是C++术语,而没有一个是C术语(其中最接近的可以说是STRUCT、INITIALIZATION、FUNCTION)。你的朋友在这里混淆了一些东西。不过我怀疑她的老师混淆了某些东西......
C 没有类,但您可以使用结构体和函数指针来模拟它。 C99 有点(只是一点点)基于 C++,所以用 C 重现类很容易。
C 主要使用函数/结构编程,而不是像 C++、Java、Python 等使用类的语言那样实现面向对象编程。但在少数情况下,我们使用如下类:
typedef struct {
ShapeClass shape;
float width, height;
}
RectangleClass;
希望有帮助。