为什么一个用户可以从私人变成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?

privateprotectedpublic 只是提示 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)。