C++ 中的结构体对 C 语言的结构体进行了武装,和类几乎没有什么区别,唯一区别在于C++中结构体内成员默认访问属性是 public 的,而 class 中的成员默认访问权限是 private 的。

那么要如何才能在 C 语言的结构体中定义私有成员呢?

直接看代码吧。

// 声明一个空的结构体,只有一个空类型指针占位。
typedef struct{
    void* _Placeholder;
}Person;

// 声明一个真实的存储数据结构体,结构体中包含联合体,为了节省内存。
// 注意 联合体必须放在结构体的开始位置,这样 Person的地址也是 PersonInternal 的地址,类型转换之后不出错。
typedef struct{
    union {
        Person public_person;
        const char* name;
    }
    int age;
    char intro[];
}PersonInternal;

// 创建 Person 时,将数据放在真实的结构体中,并返回空结构体的地址。
Person* PersonNew(const char* name,int age,const char* intro)
{
    size_t intro_len = (intro ? strlen(intro) : 0) + 1;
    PersonInternal* p = (PersonInternal*) malloc(sizeof(PersonInternal) + intro_len);
    p->age = age;
    p->name = name;
    if(intro)
    {
        strcpy(p->intro,intro);
    }
    else{
        p->intro[0] = 0;
    }
    return &p->public_person;
}

// 获取数据成员,首先对指针类型进行强制转换,然后取出成员即可。
const char* PersonGetName(const Person* p)
{
    return ((PersonInteral*)p)->name;
}

int PersonGetAge(const Person* p)
{
    return ((PersonInteral*)p)->age;
}

// 释放
void PersonDestroy(Person** ptr)
{
    if(ptr && *ptr)
    {
        free(*ptr);
        *ptr = NULL;
    }
}

void PersonSetIntro(Person** ptr,const char* intro)
{
    if(ptr && *ptr)
    {
        PersonInteral * person = (PersonInteral*) *ptr;
        Person* new_pserson = PersonNew(person->name,person->age,intro);
        PersonDestroy(ptr);
        *ptr = new_person;
    }
}