如何在C中模拟C++中的私有成员变量?

Url*_*ler 4 c

私有成员变量(如在C++中)是否可以在C中实现,如何实现?我想到静态全局变量将变量的范围限制为定义它的文件,但是如何从其他文件访问它?有没有办法在C中实现私有成员变量?

Iha*_*imi 5

您需要为此创建一个opaque类型,两个以相同字段开头的结构,然后您可以将私有字段添加到其中一个,并且永远不会让用户访问具有私有字段的字段.

然后提供访问器函数来修改/读取结构中的私有字段.

一个例子胜过千言万语

struct.c

#include <stdlib.h>

struct Private
{
    int public;
    int private;
};

struct Public
{
    int public;
};

struct Public *new_public(int private, int public)
{
    struct Private *instance;
    instance = malloc(sizeof(*instance));
    if (instance == NULL)
        return NULL;
    instance->private = private;
    instance->public  = public;

    return (struct Public *)instance;
}

int public_get_private(struct Public *public)
{
    if (public == NULL)
        return -1; /* or some invalid value */
    return ((struct Private *)public)->private;
}

void public_set_private(Public *public, int value)
{
    if (public == NULL)
        return;
    ((struct Private *)public)->private = value;
}
Run Code Online (Sandbox Code Playgroud)

struct.h

#ifndef __STRUCT_H__
#define __STRUCT_H__

struct Public
{
    int public;
};

typedef struct Public Public;

Public *new_public(int private, int public);
int public_get_private(Public *instance);
void public_set_private(Public *instance, int value);
/* you can add more fields to the structures and more access functions */

#endif
Run Code Online (Sandbox Code Playgroud)

main.c中

#include "struct.h"

#include <stdlib.h>
#include <stdio.h>

int main()
{
    Public *instance;

    instance = new_public(1, 2);
    if (instance == NULL)
        return -1;
    printf("%d\n", instance->public);
    printf("%d\n", public_get_private(instance));

    free(instance);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. new_public() 充当构造函数.
  2. 您可以private通过public_get_private()作为成员函数的函数获取值.
  3. 您无法privatePublic结构中访问该成员.

当然你可以做愚蠢的事情

Public *public = malloc(sizeof(*public));
Run Code Online (Sandbox Code Playgroud)

但那就是我对c所发现的如此甜蜜,你可以自由地做任何你想做的事,只是不要做错事.

我也认为这比private成员更好,因为定义和实现细节都是从库用户隐藏的.