C有课程吗?
Posted
技术标签:
【中文标题】C有课程吗?【英文标题】:Does C have classes? 【发布时间】:2021-08-14 15:58:05 【问题描述】:好吧,你可以叫我菜鸟,但我真的很困惑。
我的前同学付钱让我用 C 编写一个程序。她给了我任务,上面写着“废话少说至少做两门课,至少写一个构造函数,至少重写一个方法”,上面写着一个字一个字。
然后我告诉她“这是 C++ 而不是 C”她说“但我们正在学习 C”
我忽略了它并用 c++ 编写了程序并发送给她,因为我认为她不知道她在说什么。她说“它不适用于代码块,而 wtf 是 cout
我想问wtf? 还是有什么误会什么的?
编辑:这么多年后我又回到了这个问题,并注意到一些 *****es 花了一些时间从问题中删除 99% 的文本。好好生活吧,现在还不是 1984 年。
【问题讨论】:
见how-do-you-implement-a-class-in-c 【参考方案1】:不,C 没有类。也就是说,有一些方法可以在 C 中模拟面向对象的编程——快速的 Google 搜索应该会产生一些有用的结果。
【讨论】:
【参考方案2】:不,C 本身没有类,只有 C++(当时以“带类的 C”开始......)。但是您可以在 C++ 代码中使用标准 C 库,即使这通常不被认为是好的做法(其中 C++ 有自己的更高级别的构造,例如 cout
与 printf
)。
您也可以在 C 中模拟类、继承和虚函数的行为,但这不值得。
你可能应该给你的前同学买一本 C 编程书 :-)
【讨论】:
@Nick,因为通常(尽管并非总是)C++ 有自己的、更高级别、更多的面向对象结构来解决相同的问题。【参考方案3】:C 没有类的正式构造。您可以使用模块级数据生成模块,根据您自己的协议,您不会在其他任何地方使用这些数据或静态数据,并编写函数来获取、设置和以其他方式操作该数据。您甚至可以使用函数指针来操作类似的数据类型,就好像它们在一个类中一样。
但是,您不会受到 C 编译器的类语义或其他规则的保护,因为 C 编译器不知道类。但是,结构化数据非常强大。
【讨论】:
【参考方案4】:C 没有类。
但是我们可以通过使用静态全局变量作为私有类成员,使用静态函数作为私有成员函数来近似一个类。外部成员为公众。在这种情况下,可以将整个文件视为一个类。
这可能不是你想要的。
【讨论】:
【参考方案5】:一个典型的需求冲突案例,看起来:-)
她要求的术语CLASS、CONSTRUCTOR、METHOD都是C++术语,而没有一个是C术语(其中最接近的可以说是STRUCT、INITIALIZATION、FUNCTION em>)。您的朋友在这里混淆了一些东西。不过,我怀疑她的老师是否混淆了某些东西……
【讨论】:
【参考方案6】:C 没有类,但您可以使用结构和指向函数的指针来模拟它。 C99 是一点点(只是一点点)基于 C++,所以很容易用 C 复现类。
【讨论】:
C 有很长时间的结构和函数指针,实际上可以创建类之类的东西。尽管也没有可移植的类型检查,但没有重载 atd 可变数量的函数参数。我不会说这很容易。您可以创建不可移植的类(typeof、container_of)或类的残缺实现。【参考方案7】:C 不支持类,但我们确实有棘手的 hacky 解决方法。阅读完整的说明或直接向下滚动到代码部分。
结构声明:
我声明了一个名为 class 的 struct
。在里面,我放入了未初始化的function
,类型为void,名称为Print 和一个参数char。
这看起来像void class.Print(char);
结构不允许内部初始化:
但是 struct 不允许内部变量的初始化。所以我们将在外面初始化它。我们创建了一个function
,其类型为class,名称为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;
注意:
这个确切的示例已使用 VC 和 tcc 编译器成功编译和测试。class
是示例名称。您也可以使用任何其他名称。
【讨论】:
这向我显示了错误“预期';'在结构定义之后”、“typedef-declaration 中缺少类型”和“')' 标记之前的预期不合格 ID”,我尝试命名结构,但没有帮助,我使用的是 Dev-C++ 5.11Dev C++
是IDE,你用什么编译器?可能是你做错了什么。无需修改的相同代码适用于Microsoft Visual C++
、gnu c compiler
、tiny c compiler
。【参考方案8】:
C 主要使用函数式/结构式编程,而不是像 C++、Java、Python 等使用类的语言那样实现面向对象编程。但在少数情况下,我们会使用以下类:
typedef struct
ShapeClass shape;
float width, height;
RectangleClass;
希望对您有所帮助。
【讨论】:
但是如何将void
之类的函数放入struct
中?
@GrayProgrammerz 理想情况下,struct 不可能帮助您处理相关数据:#include以上是关于C有课程吗?的主要内容,如果未能解决你的问题,请参考以下文章