纯C中的等价物是什么

Rus*_*lan 4 c oop class

在OOP语言中,我们有类.在纯C中是否有相当于等级的?

use*_*ica 11

空无一人.这个事实是C++开发的最初动机,当C++被称为"C with Classes"时.你能得到的最接近的是a struct.


C中有一个旨在促进某种伪继承的特性,但它并不接近实际的面向对象的类系统.指向结构的指针可以合法地转换为指向结构的第一个成员的指针,因此您可以通过使另一个结构类型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;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用指针传递PyIntObjects和PyDictObjects PyObject并使用部件中的数据PyObject来说明封闭结构的类型.

正如您可能从名称中猜到的那样,我从Python中获取了这个示例,其中此机制用于在C之上实现Python的面向对象类型系统.


小智 6

没有什么能比得上classes.它是一个完全不同的范例.您可以structures在C 中使用.必须相应地编码以使结构完成工作.


Har*_*rry 5

您可以将C ++中的“类”交换为“结构”。我并不是说您应该这样做,但一个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;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过更多的工作在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 */
Run Code Online (Sandbox Code Playgroud)

.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;
}
Run Code Online (Sandbox Code Playgroud)

注意,我还没有测试过它,但是如果您知道C / C ++,那么您应该认识这个习惯用法。