在OOP语言中,我们有课程。在纯C中是否有相当于等级的?
答案 0 :(得分:10)
没有。这个事实是C ++开发的最初动机,当C ++被称为“C with Classes”时。最接近的是struct
。
C中有一个旨在促进某种伪继承的功能,但它并不接近实际的面向对象的类系统。指向struct的指针可以合法地转换为指向struct的第一个成员的指针,因此你可以通过让另一个结构类型B以A类成员开头来“扩展”结构类型A.
例如,您可以拥有PyObject
结构类型和一组结构类型,这些类型都以PyObject
成员开头,例如PyIntObject
,PyDictObject
等:
typedef struct {
...
} PyObject;
typedef struct {
PyObject ob_base;
// more members...
} PyIntObject;
typedef struct {
PyObject ob_base;
// more members...
} PyDictObject;
然后,您可以使用PyIntObject
指针传递PyDictObject
和PyObject
s并使用PyObject
部分中的数据来说明封闭结构的类型是什么
正如您可能已经从名称中猜到的那样,我从Python中获取了这个示例,其中此机制用于在C之上实现Python的面向对象类型系统。
答案 1 :(得分:6)
没有任何东西等同于classes
。它是一个完全不同的范例。您可以在C中使用structures
。必须相应地编码以使结构完成工作。
答案 2 :(得分:4)
你可以交换" Class"在C ++中用于" struct"。我不是说你应该,但是一个mans对象是另一个具有一些功能的mans结构。显然,C ++添加了 一些额外的位 。 C和不透明指针也是Objects
,非常有用。
#include <iostream>
struct Cat {
public:
Cat(int initialAge); // constructor
~Cat(); // destructor
int GetAge();
private: // begin private section
int itsAge; // member variable
};
Cat::Cat(int initialAge) {
itsAge = initialAge;
}
int Cat::GetAge() {
return itsAge;
}
int main(void) {
Cat *cat = new Cat(1);
std::cout << "This cat declared as a struct is " << cat->GetAge() << " years old" <<std::endl;
return 1;
}
你可以用更多的工作在C中实现类似的东西......头文件是
#ifndef CAT_H
#define CAT_H
#include <stdlib.h>
#include <stdio.h>
typedef struct Cat Cat;
typedef struct CatOps {
int (* GetAge )();
} CatOps;
struct Cat {
void * obj;
CatOps * ops;
};
Cat * new_cat(int age);
void delete_cat(Cat * cat);
#endif /* CAT_H */
.c文件是
#include "cat.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
typedef struct cat_obj {
int age;
} cat_obj;
int get_age();
static CatOps CAT_OPS = {
.GetAge = get_age,
};
Cat * new_cat(int age) {
Cat * imp;
cat_obj * obj;
imp = malloc(sizeof(*imp));
obj = malloc(sizeof(*obj));
imp->obj = obj;
imp->ops = &CAT_OPS;
return (Cat*)imp;
}
void delete_cat(Cat *cat) {
free(cat->obj);
free(cat);
}
static void get_age(Cat *cat) {
cat_obj *c = (cat_obj*)cat->obj;
}
注意,我没有测试过它,但如果你知道C / C ++,你应该认识这个习语。