为什么一个用户可以从私人变成public?
Why can a user change from private to public?
我用库制作了一个程序。
一个库有一个接口,用于包含用于外部程序调用的 header:
class IDA{
private:
class IDA_A;
IDA_A *p_IDA_A;
public:
IDA();
~IDA();
void A_Function(const char *A_String);
};
然后我和凯特一起打开了header并放置了
class IDA_A;
IDA_A *p_IDA_A;
进入public部分。
这有效吗?!但为什么?我可以避免这种情况吗?
问候语
早咬
当然可以。整个 private-public 东西只由编译器检查。这个没有 runtime-checks。如果库已经编译好,用户只需要库文件(共享object)和header文件进行开发。如果您之后以您提到的模式更改 header 文件,IDA_A
将被编译器视为 public。
如何避免这种情况?这是没有办法的。如果其他用户更改了您的 header 文件,您将无能为力。还有一个问题:为什么要费心呢?如果更改了已编译库的 header 文件,它的 side-effects 可能会非常难看。因此,更改它的人也必须处理这些问题。只有一些事情你不会做。其中之一正在为库移动 header 中的内容(除非您当前正在该库上进行开发)。
And this worked?!
是
But why?
private
、protected
和 public
只是提示 C++ 编译器应该如何使用数据结构。如果一段 C++ 源代码不遵循此,C++ 编译器将出错,但仅此而已。
它对内存布局没有任何影响。特别是 C++ 标准要求,class 的成员变量必须按照它们在 class 定义中声明的顺序排列在内存中。
And can I avoid that?
没有。以同样的方式你无法避免,其他一些代码 static_cast
是一个(不透明的)指针指向你的 class 到 char*
并将它转储到一个文件中,完全与vtable 和一切。
如果你真的想避免库的用户使用 "look inside" 你必须给他们一些句柄值并在内部使用映射(std::map
或类似的)从中查找实际实例句柄值。出于稳健性的原因,我在我开发的一些库中这样做,但也因为一些编程环境的绑定不能正确处理指针。
您可以访问 p_IDA_A
成员变量,这始终可以按照您概述的方式进行。但它是 IDA_A
类型的,你只有声明,没有定义。所以你不能用它做任何有意义的事情。 (这种数据隐藏方法称为 pimpl idiom)。
我用库制作了一个程序。 一个库有一个接口,用于包含用于外部程序调用的 header:
class IDA{
private:
class IDA_A;
IDA_A *p_IDA_A;
public:
IDA();
~IDA();
void A_Function(const char *A_String);
};
然后我和凯特一起打开了header并放置了
class IDA_A;
IDA_A *p_IDA_A;
进入public部分。
这有效吗?!但为什么?我可以避免这种情况吗?
问候语 早咬
当然可以。整个 private-public 东西只由编译器检查。这个没有 runtime-checks。如果库已经编译好,用户只需要库文件(共享object)和header文件进行开发。如果您之后以您提到的模式更改 header 文件,IDA_A
将被编译器视为 public。
如何避免这种情况?这是没有办法的。如果其他用户更改了您的 header 文件,您将无能为力。还有一个问题:为什么要费心呢?如果更改了已编译库的 header 文件,它的 side-effects 可能会非常难看。因此,更改它的人也必须处理这些问题。只有一些事情你不会做。其中之一正在为库移动 header 中的内容(除非您当前正在该库上进行开发)。
And this worked?!
是
But why?
private
、protected
和 public
只是提示 C++ 编译器应该如何使用数据结构。如果一段 C++ 源代码不遵循此,C++ 编译器将出错,但仅此而已。
它对内存布局没有任何影响。特别是 C++ 标准要求,class 的成员变量必须按照它们在 class 定义中声明的顺序排列在内存中。
And can I avoid that?
没有。以同样的方式你无法避免,其他一些代码 static_cast
是一个(不透明的)指针指向你的 class 到 char*
并将它转储到一个文件中,完全与vtable 和一切。
如果你真的想避免库的用户使用 "look inside" 你必须给他们一些句柄值并在内部使用映射(std::map
或类似的)从中查找实际实例句柄值。出于稳健性的原因,我在我开发的一些库中这样做,但也因为一些编程环境的绑定不能正确处理指针。
您可以访问 p_IDA_A
成员变量,这始终可以按照您概述的方式进行。但它是 IDA_A
类型的,你只有声明,没有定义。所以你不能用它做任何有意义的事情。 (这种数据隐藏方法称为 pimpl idiom)。