是否可以在 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.c
与 foo.h
一起分发。 foo.h
中声明的函数构成了一个类型的公共(public)接口(interface),但该类型的内部结构是不透明的;实际上,调用 create_foo()
的客户端无法访问 foo
对象的私有(private)成员。
我们的 friend FILE*
是一种类似的东西,除了类型 FILE
通常不是真正的不透明。只是大多数人(明智地)不会去探查它的内部结构。在那里,访问控制仅通过默默无闻来实现。
关于c++ - 在 C 中模拟访问说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007699/