【问题标题】:Why can a user change from private to public?为什么用户可以从私人变为公共?
【发布时间】:2015-05-27 16:07:23
【问题描述】:

我用库编写了一个程序。 一个库有一个接口,用于包含外部程序调用的标头:

  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;

进入公共部分。

这行得通?!但为什么?我可以避免这种情况吗?

问候 早吃

【问题讨论】:

  • 不要打开标题和移动声明。问题解决了。
  • 您可以避免这样做:只是不要这样做。关于防止其他人这样做,我不这么认为。
  • 我不清楚你在问什么。你是在问,“为什么我可以修改头文件?”或者“我怎样才能避免修改后的标头起作用?”或者“当代码需要私有时,为什么公共成员可以工作?”

标签: c++ linux header-files


【解决方案1】:

这行得通?!

是的

但是为什么呢?

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

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

我可以避免这种情况吗?

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

如果您真的想避免库的用户“查看内部”,您必须给他们一些句柄值并在内部使用映射(std::map 或类似的)从句柄值中查找实际实例。我在我开发的一些库中这样做,出于稳健性的原因,但也因为某些编程环境的绑定无法正确处理指针。

【讨论】:

  • 这就是我所做的……std::map。但是几天前我读到可以通过在 cpp 文件中使用变量来设置类名。但这(在我的情况下)唯一值得,如果我可以“保护”它(例如使用私人:)谢谢大家为那些快速且非常有用的答案!谢谢!问候早食
【解决方案2】:

这当然行得通。整个私人-公共的东西只由编译器检查。对此没有运行时检查。如果库已经编译,用户只需要库文件(共享对象)和头文件即可进行开发。如果您之后更改您提到的模式中的头文件,IDA_A 将被编译器视为公共。

如何避免这种情况?这是没有办法的。如果其他用户更改了您的头文件,您将无能为力。还有一个问题:为什么要打扰它?如果更改了已编译库的头文件,它可能会产生非常难看的副作用。所以改变它的人也必须处理这些问题。只是有些事情你不做。其中之一是移动库标题中的内容(除非您当前正在该库上进行开发)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 2017-12-23
      • 1970-01-01
      • 2019-03-30
      • 2011-07-11
      • 1970-01-01
      • 2015-12-11
      • 2014-07-14
      相关资源
      最近更新 更多