gpt4 book ai didi

c - C++中的private成员变量如何在C中模拟?

转载 作者:太空狗 更新时间:2023-10-29 15:26:21 30 4
gpt4 key购买 nike

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

最佳答案

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

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

举个例子胜过千言万语

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;
}

结构.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

ma​​in.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;
}
  1. new_public() 充当构造函数。
  2. 您可以通过作为成员函数的函数 public_get_private() 获取 private 的值。
  3. 您不能从 Public 结构访问 private 成员。

当然你可以做一些愚蠢的事情

Public *public = malloc(sizeof(*public));

但这就是我发现 c 的美妙之处,你可以自由地做任何你想做的事,只是不要做错事。

我还认为这比 private 成员更好,因为定义和实现细节都对库用户隐藏了。

关于c - C++中的private成员变量如何在C中模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28221198/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com