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

标签 c++ c oop

是否可以在 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/

相关文章:

c++ - 堆与读取 map 最左边节点的相对性能?

c - 为什么这个模数运算符给我带来麻烦?

c - 有一个没有定义的结构是什么意思?

python - 在 Python 运行时创建对象

javascript - 了解 Javascript 中的功能范围、 `this` 和 OO 设计模式

c++ - 从远程执行的进程获取状态

c++ - 在 Windows 和 Mac 上发送 http 包的最简单方法

c++ - 为什么rand()的范围比int的小?

c - 如果在输入时 scanf 中不包含 '&' 运算符,会发生什么情况?

oop - Rust,相同类型,来自同一模块的单独导入的不同路径