这是如何在C语言中创建面向对象的基础知识
1.创建对象和封装
通常-人们创建一个像
object_instance = create_object_typex(parameter);
方法可以在这里以两种方式之一进行定义。
object_type_method_function(object_instance,parameter1)
OR
object_instance->method_function(object_instance_private_data,parameter1)
请注意,在大多数情况下,object_instance (or object_instance_private_data)
返回的类型为void *.
:应用程序不能引用此单个成员或函数。
除此之外,每个方法都将这些object_instance用于后续方法。
2.多态性
我们可以使用许多函数和函数指针在运行时覆盖某些功能。
例如,-所有object_methods都定义为一个函数指针,可以扩展到公共方法和私有方法。
我们还可以在有限的意义上应用函数重载,方法是使用重载var_args
与在printf中定义可变数量的参数非常相似。是的,这在C ++中并不十分灵活-但这是最接近的方式。
3.定义继承
定义继承有些棘手,但是可以对结构进行以下操作。
typedef struct {
int age,
int sex,
} person;
typedef struct {
person p,
enum specialty s;
} doctor;
typedef struct {
person p,
enum subject s;
} engineer;
// use it like
engineer e1 = create_engineer();
get_person_age( (person *)e1);
这里的doctor
and engineer
是从person派生的,可以将其转换为更高级别,例如person
。
最好的例子是在GObject及其派生对象中使用。
4.创建虚拟类
我引用一个名为libjpeg的库的真实示例,该库被所有浏览器用于jpeg解码。它创建了一个名为error_manager的虚拟类,应用程序可以创建具体的实例并提供回馈-
struct djpeg_dest_struct {
/* start_output is called after jpeg_start_decompress finishes.
* The color map will be ready at this time, if one is needed.
*/
JMETHOD(void, start_output, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo));
/* Emit the specified number of pixel rows from the buffer. */
JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo,
JDIMENSION rows_supplied));
/* Finish up at the end of the image. */
JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo));
/* Target file spec; filled in by djpeg.c after object is created. */
FILE * output_file;
/* Output pixel-row buffer. Created by module init or start_output.
* Width is cinfo->output_width * cinfo->output_components;
* height is buffer_height.
*/
JSAMPARRAY buffer;
JDIMENSION buffer_height;
};
在此请注意,JMETHOD通过宏扩展函数指针,该宏需要分别使用正确的方法加载。
我试图说太多事情,而没有太多个人解释。但我希望人们可以尝试自己的事情。但是,我的目的只是展示事物的映射方式。
而且,会有很多论点认为这将不是C ++等效项的完全正确的属性。我知道C语言中的OO对其定义没有那么严格。但是像这样工作会理解一些核心原则。
重要的是,OO不是像C ++和JAVA那样严格。这是一个可以在结构上以面向对象的思想组织代码并以这种方式进行操作的代码。
我强烈建议人们看到libjpeg的真实设计和以下资源
一种。C
b中的面向对象编程。这是人们交流想法的好地方
。这是整本书
extern "C"
可以从python使用。您可以手动执行此操作,也可以让SWIG来帮助您。因此,对于python前端的渴望没有理由不使用C ++。这并非如此说,有没有正当的理由想和C.