-2

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

class Car {
     //code
};

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

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

4

3 回答 3

2

但我不明白 C 怎么不能有课程

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

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

是的。

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

有一整篇关于该主题的论文(谷歌,第一次点击)。

旁注:您可以使用结构在 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();

还有一篇关于这个主题的论文。

于 2012-11-14T19:16:33.950 回答
0

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看到前向声明 由于类型不完整,只能声明指向类型的指针。在中,结构类型与定义一起完成,因此其中的函数可以访问这些成员。 struct Car;Car.hmainstruct CarCar.cstruct Car {char *make; char *model; ...};Car.c

于 2012-11-14T21:44:48.870 回答
0

You can use the typedef keyword to create types in C. I usually do this sort of thing:

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

Something like that.

Actually C can have classes, kind of. Early implementations of C++ and Objective C were done with preprocessors, I think. The problem is that you don't get true data hiding and methods. You end up using function pointers for methods -- and that is both a maintenance nightmare and a lot of work to set up. Not sure how you'd do inheritance, but it would probably be a mess of pointers to other structs.

So, yeah, you can slap something like that together. But please don't.

于 2012-11-14T19:21:23.147 回答