C数据类型创建

时间:2012-11-14 19:13:34

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

所以我试图学习C,我明白它没有课程。但是,我只是在做c ++编程并创建一个特殊类型的对象,让我们说汽车,我必须为它做一个类。像这样:

class Car {
     //code
};

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

但我不明白当你this之类的东西时C不能上课。您正在声明FILE类型的变量。那么这意味着FILEstdio.h文件中的结构吗?数据类型如何在C中完全起作用?

3 个答案:

答案 0 :(得分:2)

  

但我不明白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关于此主题。

答案 1 :(得分:0)

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

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

类似的东西。

实际上C可以有类,有点类。我认为C ++和Objective C的早期实现是使用预处理器完成的。问题是你没有得到真正的数据隐藏和方法。你最终使用方法的函数指针 - 这既是维护的噩梦,也是很多设置工作。不确定你是如何做继承的,但它可能是指向其他结构的一堆乱七八糟的指针。

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

答案 2 :(得分: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.h;由于类型不完整,main只能声明指针以键入struct Car。在Car.c中,结构类型使用定义struct Car {char *make; char *model; ...};完成,因此Car.c中的函数可以访问这些成员。