26

好吧,你可以叫我菜鸟,但我真的很困惑。

我的前同学付钱让我用 C 写一个程序。她给了我任务,上面写着“废话少说至少做两门课,至少写一个构造器,至少重写一个方法”,它一个字一个字地说.

然后我告诉她“这是 C++ 而不是 C”她说“但我们正在学习 C”

我忽略了它并用 C++ 编写了程序并发送给她,因为我认为她不知道她在说什么。她说“它不适用于代码块,而 wtf 是 cout <<”,然后她给我发了一段他们编写的代码,而不是 cout 和 cin,而是 printf 和 scanf。它必须是 C。所以,我用 printf 和 scanf 重写了程序,她仍然说代码块会抛出错误(我仍然按照任务要求离开课程)。

我想问wtf?C有课程吗?还是有什么误会什么的?

编辑:这么多年后我又回到了这个问题,并注意到一些 *****es 花了一些时间从问题中删除 99% 的文本。获得生活,这还不是1984年。

4

8 回答 8

22

不,C 没有课程。也就是说,有一些方法可以在 C 中模拟面向对象的编程——快速的 Google 搜索应该会产生一些有用的结果。

于 2012-04-25T12:43:11.077 回答
19

不,C 本身没有类,只有 C++(当时以“带类的 C”开始......)。但是您可以在 C++ 代码中使用标准 C 库,即使它通常不被认为是好的做法(其中 C++ 有自己的更高级别的构造,例如coutvs printf)。

您也可以在 C 中模拟类、继承和虚函数的行为,但这不值得。

你可能应该给你的前同学买一本 C 编程书 :-)

于 2012-04-25T12:41:51.793 回答
4

C 没有类的正式结构。您可以生成具有模块级数据的模块,根据您自己的协议,您不会在其他任何地方使用这些数据或静态数据,并编写函数来获取、设置和以其他方式操作该数据。您甚至可以使用函数指针来操作类似的数据类型,就好像它们在一个类中一样。

但是,您不会受到 C 编译器的类语义或其他规则的保护,因为 C 编译器不知道类。但是,结构化数据非常强大。

于 2012-04-25T12:44:35.877 回答
3

C 没有类。

但是可以通过使用静态全局变量作为私有类成员,使用静态函数作为私有成员函数来近似一个类。外部成员为公众。在这种情况下,可以将整个文件视为一个类。

可能这不是你想要的。

于 2012-04-25T12:41:41.637 回答
2

C 没有类,但您可以使用结构和指向函数的指针来模拟它。C99 是一点点(只是一点点)基于 C++,所以很容易用 C 复现类。

于 2012-04-25T13:34:21.923 回答
2

一个典型的冲突需求案例,似乎:-)

她要求CLASS、CONSTRUCTOR、METHOD的术语都是 C++ 术语,而没有一个是 C 术语(其中最接近的可以说是STRUCT、INITIALIZATION、FUNCTION)。你的朋友在这里混淆了一些东西。我怀疑她的老师是否混淆了某些东西,尽管...

于 2012-04-25T12:53:46.190 回答
2

C 不支持类,但我们确实有棘手的 hacky 解决方法。阅读完整的解释或简单地向下滚动到代码部分。

结构声明:

我声明了一个struct带有名称的在里面,我使用voidfunction类型、名称Print和一个参数char进行初始化。这看起来像void class.Print(char);

结构不允许内部初始化:

但是 struct 不允许内部变量的初始化。所以我们将在外面初始化它。我们创建了一个function类,名称Printer。它初始化并返回我们可以轻松使用的初始化结构。struct

打电话给班级:

现在我们包含了 helper header 和声明的变量 type class, name printer1, value 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是示例名称。您也可以使用任何其他名称。
于 2021-08-13T09:59:24.333 回答
0

C 主要使用功能/结构编程,而不是像 C++、Java、Python 等使用类的语言那样实现面向对象编程。但在少数情况下,我们使用如下类:

typedef struct {
    ShapeClass shape;
    float width, height;
}
RectangleClass;

希望它有所帮助。

于 2021-06-18T08:26:27.807 回答