C语言中模拟类的封装

作者: NiceBlueChai | 来源:发表于2017-10-12 22:58 被阅读27次

    实现类的封装:对象具有一定的内存空间,我们可以向其中放入和取出信息。首先定义模拟类

    #pragma once
    
    
    typedef struct 
    {
        int m_maxlen;
        //模拟成员变量(MemberVariable)
    
        char* m_info;
    
    }SimClass;  //模拟类(Class)
    
    
    void CSimClass(SimClass* sc, int maxlen);//模拟构造函数(Constructor)
    
    void DSimClass(SimClass* sc);//模拟析构函数(Destructor)
    
    int SimClass_Save(SimClass* sc, const char* info);//模拟成员函数(MemberFunction)
    
    int SimClass_Load(SimClass* sc, char** info);
    

    接着在同名.c文件中实现方法

    #include<stdio.h>
    #include "SimClass.h"
    
    //SimClass.c(注意而非.cpp)
    void CSimClass(SimClass* sc, int maxlen)
    {
        sc->m_maxlen = maxlen;
        sc->m_info = (char*)malloc(sizeof(char)* maxlen);//开辟一段空间
    }
    
    void DSimClass(SimClass* sc)
    {
        free(sc->m_info);//释放一段空间
    }
    
    int SimClass_Save(SimClass* sc, const char* info)
    {
        if (sc->m_maxlen < strlen(info))
            return-1;//信息太长
        strcpy(sc->m_info, info);
        return 0;//成功
    }
    
    int SimClass_Load(SimClass* sc, char** info)
    {
        *info = sc->m_info;
        return 0;//成功
    }
    
    

    这样类就实现完成了。我们这种方法是用
    SimClass_
    用来模拟C++的函数前缀"SimClass::",这样就避免了多个类的同名函数造成的重定义。然后再将结构体
    SimClass*sc
    作为第一个参数传入成员函数,这样在成员函数中就能够访问类的成员变量了。
    封装后就能够很容易地复用了:例如

    #include<stdio.h>
    #include "SimClass.h"
    int main()
    {
        SimClass SCA, SCB;
        CSimClass(&SCA, 64);
        CSimClass(&SCB, 32);
    
        SimClass_Save(&SCA, "ao好久不见\0");
        SimClass_Save(&SCB, "hdgkajsh");
    
        char* buf;
        SimClass_Load(&SCA, &buf);//取
        printf("%s", buf);
    
        char* bufB;
        SimClass_Load(&SCB, &bufB);//取
        printf("%s", bufB);
        //这样就可以打印出先前存的内容
    
        DSimClass(&SCA);//也需要显式地析构
        DSimClass(&SCB);
    
        return 0;
    }
    

    ❤️


    相关文章

      网友评论

        本文标题:C语言中模拟类的封装

        本文链接:https://www.haomeiwen.com/subject/awioyxtx.html