2012-11-14 121 views
-2

所以我想学习C,我明白它没有类。但是,我只做了C++编程,并创建了一个特殊类型的对象,比方说汽车,我必须为它创建一个类。事情是这样的:C数据类型创建

class Car { 
    //code 
}; 

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

但我不明白怎么Ç不能上课,当你像this。您正在声明类型为FILE的变量。那么这是否意味着FILEstdio.h文件中的结构?数据类型如何在C中完全工作?

+0

您的观点非常好 - 我同意你的意见 – paulsm4

+5

维基百科的['typedef'](http://en.wikipedia.org/wiki/Typedef)是什么部分对你来说很模糊? – mouviciel

+1

C有复合类型(“结构体”),但它们不能具有成员函数,因此它们不是OO意义上的“类”。他们只是复合类型。 –

回答

2

但我不明白怎么Ç不能上课

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

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

是的。

数据类型如何在C中完全工作?

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

旁注:你可以在C使用结构模拟面向对象的编程风格,它只是看你是否不叫什么OO点的问题。例如,考虑臭名昭著的libcurl网络库的使用:写一些OOP,这样的代码

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

这主要是冗长(明确):关于这个主题

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

There also is a paper

+2

该科目有多篇论文,但在提问之前没有读过一篇论文。 – Mithrandir

+0

@Mithrandir当然我并不是说“这里只有一篇论文,这就是为什么你没有发现它到目前为止你已经完成的详尽的谷歌搜索”...... P: – 2012-11-14 19:22:32

+0

我在C和C上的论文编程类型早于谷歌,实际上是写在纸上。但当然,这不再是相关的知识。 ;-) – Mithrandir

0

可以使用typedef关键字创建类型C.我平时做这样的事情:

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

类似的东西。

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

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

+0

关于OO-C,请查看程序员SE上的[OO最佳实践](http://programmers.stackexchange.com/q/118253/1033)。 – mouviciel

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中的函数可以访问这些成员。