为什么用户可以从私人变为公众?

时间:2015-05-27 08:00:09

标签: c++ linux header-files

我用库创建了一个程序。 一个库有一个接口,用于包含外部程序调用的标题:

  class IDA{
  private:
      class IDA_A;
      IDA_A *p_IDA_A;
  public:
      IDA();
      ~IDA();
      void A_Function(const char *A_String);
  };

然后我用Kate打开标题并放置

      class IDA_A;
      IDA_A *p_IDA_A;

进入公共部分。

这有用吗?!但为什么?我可以避免这种情况吗?

问候语 Earlybite

3 个答案:

答案 0 :(得分:0)

当然这很有效。整个私有公共事物只能由编译器检查。没有运行时检查。如果库已经编译,则用户只需要库文件(共享对象)和头文件进行开发。如果您之后更改了您提到的模式中的头文件,编译器会将IDA_A视为公共文件。

你怎么能避免这种情况?没有办法解决这个问题。如果另一个用户更改了头文件,则无法对其进行任何操作。还有一个问题:为什么要烦恼呢?如果已经编译的lib的头文件已被更改,它可能会产生非常难看的副作用。所以改变它的人也必须处理这些问题。只有一些你不做的事情。其中一个是移动库中的标题(除非您当前正在该库上开发)。

答案 1 :(得分:0)

  

这有用吗?!

  

但为什么?

privateprotectedpublic只是提示C +++编译器应该如何使用数据结构。如果C ++源代码不遵循这一点,那么C ++编译器就会出错,但就是这样。

它对内存布局没有任何影响。特别是C ++标准规定,类的成员变量必须按照它们在类定义中声明的顺序排列在内存中。

  

我可以避免吗?

没有。以同样的方式你无法避免,其他一些代码static_cast sa(不透明)指向你的类char*,并将其转储到文件中,完全使用vtable和所有内容。

如果你真的想避免库的用户“向内看”,你必须给它们一些句柄值,并在内部使用地图(std::map或类似的)从句柄值中查找实际的实例。我在我开发的一些库中执行此操作,出于稳健性原因,但也因为某些编程环境存在绑定而无法正确处理指针。

答案 2 :(得分:0)

您可以访问p_IDA_A成员变量,这总是可以按照您概述的方式进行。但它的类型为IDA_A,您只有一个声明,而不是定义。所以你不能用它做任何有意义的事情。 (这种数据隐藏方法称为pimpl习语)。