所以我试图学习C,我明白它没有课程。但是,我只是在做c ++编程并创建一个特殊类型的对象,让我们说汽车,我必须为它做一个类。像这样:
class Car {
//code
};
void main() {
Car c; //or Car c = new c(//constructor);
}
但我不明白当你this之类的东西时C不能上课。您正在声明FILE
类型的变量。那么这意味着FILE
是stdio.h
文件中的结构吗?数据类型如何在C中完全起作用?
答案 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
中的函数可以访问这些成员。