gpt4 book ai didi

c++ - 在 C 中模拟访问说明符

转载 作者:太空狗 更新时间:2023-10-29 20:05:51 25 4
gpt4 key购买 nike

是否可以在 C 中模拟 C++ 访问说明符 [public、private、protected]?更一般地说,C++ 编译器如何确保类的私有(private)成员不被非成员函数访问?

最佳答案

C++ 访问控制完全是编译器想象力的虚构:您不能访问私有(private)成员只是因为编译器将拒绝编译任何试图这样做的代码。

通过诱使编译器认为指向 ClassWithPrivateMember 实例的指针实际上是指向 ClassWithPublicMember< 实例的指针,访问 C++ 类的私有(private)成员实际上相当简单——也就是说,通过使用一个稍微修改过的头文件,你通常可以访问你不应该访问的东西。并不是说有人做过那样的事......

在 C 中进行访问控制的最佳方法是传递指向不透明类型的指针:struct 对象,其定义对客户端代码不可用。如果您提供一个 foo* create_foo() 方法和一系列操作 foo* 的方法,隐藏 foo 的实际定义client,那么你会达到类似的效果。

// File "foo_private.h"
struct foo {
int private1;
char private2;
};

// File "foo.h"
typedef struct foo foo;
foo * create_foo(int x, char y);
int mangle_foo(foo *);

// file "foo.c"
#include <stdlib.h>
#include "foo.h"
#include "foo_private.h"

foo * create_foo(int x, char y) {
foo * f = (foo *) calloc(1, sizeof(foo));
f->private1 = x;
f->private2 = y;
}

int mangle_foo(foo *f) {
return f->private1 + f->private2;
}

现在,您将编译成库的 foo.cfoo.h 一起分发。 foo.h中声明的函数构成了一个类型的公共(public)接口(interface),但该类型的内部结构是不透明的;实际上,调用 create_foo() 的客户端无法访问 foo 对象的私有(private)成员。

我们的 friend FILE* 是一种类似的东西,除了类型 FILE 通常不是真正的不透明。只是大多数人(明智地)不会去探查它的内部结构。在那里,访问控制仅通过默默无闻来实现。

关于c++ - 在 C 中模拟访问说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007699/

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