c class

/* simple_cat.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 10

typedef struct Animal{
    void *this;
    char name[MAX];
    void (*shout)(struct Animal *); 
}Animal;

typedef struct Cat{
    Animal *animal;
}Cat;

void shout_cat(Animal *cat) {
    printf("%s miaomiao. \n", cat->name);
}

void visit_animal(Animal *animal) {
    animal->shout(animal);
}

void initialize_cat(Cat* cat, char *name) {
    cat->animal = (Animal *) malloc(sizeof(Animal));
    cat->animal->this = cat;
    cat->animal->shout = shout_cat;
    strcpy(cat->animal->name, name);
}

void finalize_cat(Cat *cat) {
    free(cat->animal);
}

void main() {
    Cat cat;
    initialize_cat(&cat, "Kitty");
    visit_animal(cat.animal);
    finalize_cat(&cat);
}

 

写道
Kitty miaomiao.
Kitty cannot swim.

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <conio.h>
#define MAX 10

typedef struct Animal{
    void *this;
    char name[MAX];
    void (*shout)(struct Animal *); 
}Animal;

typedef struct Swimmable{
    void *this;
    void (*swim)(struct Swimmable *); 
}Swimmable;

typedef struct Dog{
    Animal *Animal;
    Swimmable *Swimmable;
}Dog;

typedef struct Cat{
    Animal *Animal;
    Swimmable *Swimmable;
}Cat;

void shout_Cat(Animal *cat){
    printf("%s miaomiao.\n", cat->name);
}

void swim_Cat(Swimmable *cat){
    printf("%s cannot swim.\n", ((Cat *)(cat->this))->Animal->name);
}

void shout_Dog(Animal *dog){
    printf("%s wangwang.\n", dog->name);
}

void swim_Dog(Swimmable *dog){
    printf("%s can swim.\n", ((Dog *)(dog->this))->Animal->name);
}

void visit_Animal(Animal *animal){
    animal->shout(animal);
}
void visit_Swimmable(Swimmable *swimmable){
    swimmable->swim(swimmable);
}

void initialize_Dog(Dog* dog, char *name){
    dog->Animal = (Animal *) malloc(sizeof(Animal));
    dog->Animal->this = dog;
    dog->Animal->shout = shout_Dog;
    strcpy(dog->Animal->name, name);
    dog->Swimmable = (Swimmable *) malloc(sizeof(Swimmable));
    dog->Swimmable->this = dog;
    dog->Swimmable->swim = swim_Dog;
}

void initialize_Cat(Cat* cat, char *name){
    cat->Animal = (Animal *) malloc(sizeof(Animal));
    cat->Animal->this = cat;
    cat->Animal->shout = shout_Cat;
    strcpy(cat->Animal->name, name);
    cat->Swimmable = (Swimmable *) malloc(sizeof(Swimmable));
    cat->Swimmable->this = cat;
    cat->Swimmable->swim = swim_Cat;
}

void finalize_Dog(Dog *dog){
    free(dog->Animal);
    free(dog->Swimmable);
}

void finalize_Cat(Cat *cat){
    free(cat->Animal);
    free(cat->Swimmable);
}

void main(){
    Dog dog;
    Cat cat;
    //clrscr();
    initialize_Dog(&dog, "Wangcai");
    initialize_Cat(&cat, "Kitty");
    visit_Animal(dog.Animal);
    visit_Animal(cat.Animal);
    visit_Swimmable(dog.Swimmable);
    visit_Swimmable(cat.Swimmable);
    finalize_Dog(&dog);
    finalize_Cat(&cat);
}
        

 

写道
Wangcai wangwang.
Kitty miaomiao.
Wangcai can swim.
Kitty cannot swim.

 

### C语言中 `class` 关键字的使用方法及其替代方式 #### 1. **C语言与类的关系** C语言本身并不支持面向对象编程(OOP),因此它并没有内置的 `class` 关键字。然而,在更高级的语言如C++中,`class` 是实现封装、继承和多态的核心机制之一。如果希望在C语言中模拟类似的结构化设计模式,则可以通过其他手段来间接实现。 #### 2. **C语言中的结构体作为类的替代品** 虽然C语言不提供直接的 `class` 支持,但它提供了另一种强大的工具——**结构体 (struct)** 来组织复杂的数据类型[^3]。通过组合结构体以及函数指针的方式,可以在一定程度上模仿类的行为: ```c // 定义一个简单的结构体表示“类” typedef struct { int value; } MyClass; // “成员函数”的实现 void setValue(MyClass* obj, int val) { obj->value = val; } int getValue(const MyClass* obj) { return obj->value; } ``` 上述代码展示了如何利用结构体配合外部函数的形式创建类似于OO风格的对象操作接口[^5]。 #### 3. **静态变量与函数的应用** 为了进一步增强这种伪类的功能性,还可以引入 `static` 关键字限定某些成员或方法仅限于当前源文件内部访问[^4]。这有助于控制模块间的耦合度并保护私密信息不受外界干扰。 例如: ```c // 将setValue设为private属性 static void _internalSetValue(MyClass* obj, int val); extern void publicSet(MyClass* obj, int val){ _internalSetValue(obj,val); } static void _internalSetValue(MyClass* obj, int val){ obj->value=val; } ``` 这里 `_internalSetValue()` 被声明成静态函数从而限制其可见范围至本单元内。 #### 4. **仿造构造器/析构器行为** 尽管无法真正意义上定义构造子或者销毁者,我们依然能够借助初始化列表完成相似的任务: ```c MyClass* createInstance(){ MyClass* instance=(MyClass*)malloc(sizeof(MyClass)); if(instance!=NULL)setValue(instance,0); // 默认初始状态设定 return instance; } void destroyInstance(MyClass* inst){ free(inst); } ``` 以上片段演示了一个简易版的新实例分配逻辑加上资源释放流程[^1]。 综上所述,即便缺少原生的支持,凭借灵活运用现有的语法特性同样可以让开发者构建起接近现代程序设计理念的基础框架体系出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值