纯C中的等价物是什么

时间:2016-04-06 07:05:43

标签: c class oop

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

3 个答案:

答案 0 :(得分:10)

没有。这个事实是C ++开发的最初动机,当C ++被称为“C with Classes”时。最接近的是struct

C中有一个旨在促进某种伪继承的功能,但它并不接近实际的面向对象的类系统。指向struct的指针可以合法地转换为指向struct的第一个成员的指针,因此你可以通过让另一个结构类型B以A类成员开头来“扩展”结构类型A.

例如,您可以拥有PyObject结构类型和一组结构类型,这些类型都以PyObject成员开头,例如PyIntObjectPyDictObject等:

typedef struct {
    ...
} PyObject;

typedef struct {
    PyObject ob_base;
    // more members...
} PyIntObject;

typedef struct {
    PyObject ob_base;
    // more members...
} PyDictObject;

然后,您可以使用PyIntObject指针传递PyDictObjectPyObject 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 ++,你应该认识这个习语。