【问题标题】:How to implement protected access modifier for struct in C如何在 C 中为结构实现受保护的访问修饰符
【发布时间】:2021-05-13 03:19:34
【问题描述】:

我想自己访问结构成员,不希望其他人看到详细信息。 我的意思是 Java 中受保护的访问修饰符。

我有一个名为linkedlist.c 的文件,其结构如下:

struct listNode
{
    int data;
    struct listNode *next;
};

struct linkedlist
{
    ListNode *head;
};

还有一个像这样的头文件linkedlist.h:

typedef struct listNode ListNode;
typedef struct linkedlist LinkedList;

但我无法在另一个名为 priority_queue.c 的文件中使用结构成员,因为结构定义仅在 .c 文件中。

如何实现这些我自己可以访问成员但其他程序员只能看到类型 LinkedList 和 ListNode 的结构?

【问题讨论】:

  • 您需要两个标题。一是定义公共接口。另一个定义受保护的接口。第二个应该包括第一个以确保一致性。您的代码使用受保护的接口。其他人的代码都使用公共接口。
  • 切换到 C++ 你将拥有这个(struct 中的private 修饰符)。您可以同时保持面向过程的编程。
  • 使用不透明结构:What is an opaque pointer in C?

标签: c struct linked-list access-modifiers


【解决方案1】:

正如我在简洁的comment 中指出的那样,我认为您将需要两个标头(或者,我会使用两个标头来解决这个问题)。一个标头定义了公共接口。另一个定义受保护的接口。第二个应该包括第一个以确保一致性。您的代码使用受保护的接口。其他人的代码都使用公共接口。

我的意思是公共接口是一种不透明类型,而“受保护”接口定义了私有细节。接口中的函数将使用指向不透明类型的指针,因此您的公共标头可能是:

linkedlist.h

#ifndef LINKEDLIST_H_INCLUDED
#define LINKEDLIST_H_INCLUDED

typedef struct listNode ListNode;
typedef struct linkedlist LinkedList;
typedef int Data;

extern LinkedList *ll_create(void);
extern ListNode *ln_create(Data value);
extern void ll_destroy(LinkedList *ll);
extern void ln_destroy(ListNode *ln);

…

#endif /* LINKEDLIST_H_INCLUDED */

您还会有第二个标题,它提供受保护的访问权限,称为linkedlistp.h

#ifndef LINKEDLISTP_H_INCLUDED
#define LINKEDLISTP_H_INCLUDED

#include "linkedlist.h"

struct listNode
{
    Data data;
    ListNode *next;
};

struct linkedlist
{
    ListNode *head;
};

#endif /* LINKEDLISTP_H_INCLUDED */

您的源文件linkedlist.c 将包括linkedlistp.h;任何其他需要参与数据结构内部的源文件也是如此。普通用户代码只能访问linkedlist.h,因此只能使用公共接口。

它主要是在一个可以被多个特权源文件使用的标头中重新命名私有实现细节,而不是像通常那样隐藏在单个源文件中(并且就像您目前拥有的那样)。它不会强制分离——除非您不分发私有标头,否则任何人都可以通过包含受保护的标头来决定他们的代码对内部是私有的。在组织内的项目中,您可以制定规则以禁止使用受保护的标头。如果您将代码作为开源项目发布,您将无法控制人们如何使用受保护的标头。

请注意,保护是“全有或全无”;没有中途的房子。代码要么知道所有结构的内部信息(因为它包含linkedlistp.h),要么一无所知(因为它只包含linkedlist.h)。

应审查命名约定。您的结构标签有不同的大小写,这不好;我坚持你的拼写。我猜想ll_ln_ 前缀是“链表”和“列表节点”函数——你可以使用任何你喜欢的东西,或多或少地冗长。文件名后缀p(如linkedlistp.h)是一种简洁但较为常见的方式来指示标头是“私有”或“受保护”。您可以选择一个可能更详细的替代名称。

【讨论】:

    【解决方案2】:

    简短的回答,您不能保护结构中的变量,您应该考虑使用类,或创建方法(函数)来更新和读取结构的成员,在其中添加逻辑以防止访问。您提供给其他开发人员的文档将仅包含“允许的方法” 请记住,任何人都可以获得指向您的结构的指针,并且由于他们具有类型,因此他们可以以任何他们想要的方式访问您的结构(因为任何人都可以在他/她的代码中重新定义您的结构)。

    【讨论】:

    • C 没有类或成员函数(也称为方法)。
    • 此外,OP 已经保护了对其结构成员的访问。他们在询问如何放松而不是收紧。
    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 2013-04-03
    • 2019-05-07
    • 2014-12-29
    • 2016-04-03
    • 2012-03-25
    相关资源
    最近更新 更多