【问题标题】:C Data Type CreationC 数据类型创建
【发布时间】:2012-11-14 19:13:34
【问题描述】:

所以我正在尝试学习 C,但我知道它没有课程。但是,我一直在做 c++ 编程并创建一个特殊类型的对象,比如说汽车,我必须为它创建一个类。像这样的:

class Car {
     //code
};

void main() {
    Car c; //or Car c = new c(//constructor);
}

但我不明白当你像this 这样的东西时,C 怎么不能有类。您正在声明一个FILE 类型的变量。那么这是否意味着FILEstdio.h 文件中的一个结构?数据类型在 C 中是如何工作的?

【问题讨论】:

  • 你的观点很好——我同意你的观点
  • 维基百科的typedef 的哪一部分对你来说是模糊的?
  • C 具有复合类型(“结构”),但它们不能具有成员函数,因此它们不是 OO 意义上的“类”。它们只是复合类型。

标签: c class struct stdio abstract-data-type


【解决方案1】:

但我不明白 C 怎么不能有类

因为它不是严格意义上的面向对象语言。

这是否意味着 FILE 是 stdio.h 文件中的结构?

是的。

数据类型在 C 中是如何工作的?

有一个关于该主题的entire paper(Google,第一次点击)。

旁注:您可以使用结构在 C 中模拟面向对象的编程风格,您是否称其为 OO 只是一个观点问题。例如,考虑使用臭名昭著的 libcurl 网络库:

CURL *hndl = curl_easy_init();
curl_easy_setopt(hndl, CURLOPT_URL, "http://example.com");
curl_easy_perform(hndl);
curl_easy_cleanup(hndl);

这本质上是冗长(明确)地编写一些像这样的 OOP 代码:

CURL hndl;
hndl->url = "http://example.com";
hndl->perform();

There also is a paper关于这个话题。

【讨论】:

  • 关于该主题的论文不止一篇,但遗憾的是在提问之前没有阅读过一篇。
  • @Mithrandir 当然,我并不是说“这方面只有一篇论文,这就是为什么你到目前为止所做的详尽的谷歌搜索没有找到它”......:P
  • 我关于 C 和编程类型的论文早于 google,实际上是写在纸上的。但是,当然,这不再是相关的知识。 ;-)
  • @Mithrandir 你是说 K&R 不再相关吗? O.o
【解决方案2】:

您可以使用 typedef 关键字在 C 中创建类型。我通常会这样做:

struct car_st {
    int numberOfSeats;
};
typedef struct car_st CAR;
typedef struct car_st * CAR_PTR;  

类似的东西。

实际上,C 可以有类。我认为 C++ 和 Objective C 的早期实现是用预处理器完成的。问题是你没有得到真正的数据隐藏和方法。您最终会为方法使用函数指针——这既是维护的噩梦,也需要大量的设置工作。不确定您将如何进行继承,但它可能是指向其他结构的指针的混乱。

所以,是的,你可以一起拍这样的东西。但请不要。

【讨论】:

【解决方案3】:

C 等效项是为Car 的属性定义一个结构类型,然后定义函数来操作Car 类型的对象。这就是 FILE 类型的工作原理:

FILE *f = fopen("afile.txt", "r"); // open a file for reading
fgets(buffer, sizeof buffer, f);   // read from a file
fprintf(f, "%d on the wall", bottles--); // write formatted text to the file

我们绝不会直接操作FILE 类型的对象;我们只是来回传递传递指针。

没有访问控制;您不能制作 C 结构 public 和其他 private 的某些部分;你可以像这样隐藏实现:

/** Car.h */
...
struct Car; 

struct Car *createCar(void);
void deleteCar(struct Car **theCar);
int startCar(struct Car *theCar);
...

/** Car.c */

#include "Car.h"
...
struct Car {
   char *make;
   char *model;
   int  year;
   ...
};

struct Car *createCar(void)
{
  struct Car *p = malloc(sizeof *p);
  if (p)
  {
    ... // initialize attributes
  }
  return p;
}

void deleteCar(struct Car **theCar)
{
  free(*theCar);
  *theCar = NULL;
}

void startCar(struct Car *theCar)
{
  theCar->running = 1; 
}

/** main.c */
#include "Car.h"
...
int main(void)
{
  struct Car *c = createCar();
  startCar(c);
  ...
  deleteCar(&c);
}

在本例中,main.c 仅在 Car.h 中看到前向声明 struct Car;;由于类型不完整,main 只能将 指针 声明为类型 struct Car。在Car.c 中,结构类型以定义struct Car {char *make; char *model; ...}; 完成,因此Car.c 中的函数可以访问这些成员。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多