C有课吗?

问题描述 投票:0回答:8

我被要求实现一个“带有类的 C 程序”。 C有课吗,还是有什么误会?

c class
8个回答
24
投票

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


20
投票

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

cout
printf
)。

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

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


4
投票

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

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


3
投票

C 没有类。

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

这可能不是你想要的。


3
投票

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;
}

注:

  • 这个确切的示例已使用 VC 和 tcc 编译器成功编译和测试。
  • class
    是示例名称。您也可以使用任何其他名称。

2
投票

这似乎是需求冲突的典型案例:-)

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


2
投票

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


0
投票

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

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

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.