【问题标题】:Is defining private to public guaranteed to keep the class's structure?定义私有到公共是否保证保持类的结构?
【发布时间】:2015-08-13 08:46:17
【问题描述】:

我有一个特殊的 cpp 文件,我希望它可以访问所有内容。 我正在考虑定义:

#define private public

在文件的开头,而不是包含我需要的所有内容。

是否保证可以工作,或者编译器可以在这种情况下更改类的结构?

我不是在问它是聪明还是漂亮(显然不是),只是它是否会起作用。

具体来说,我使用的是 VS2013。

【问题讨论】:

  • 这是一个非常糟糕的主意!
  • 如果你使用标准库,这个定义会给出未定义的行为。
  • @DanielA.White 我完全同意。有时这被用作 hack,以使测试代码能够访问类内部函数。
  • "[class.mem]/13 分配具有相同访问控制(第 11 条)的(非联合)类的非静态数据成员,以便以后的成员具有类对象中的更高地址。具有不同访问控制的非静态数据成员的分配顺序未指定(第 11 条)。所以是的,理论上改变访问控制可能会改变类的二进制布局。此外,在程序的不同部分为同一个类提供两个不同的定义违反了一个定义规则,因此程序表现出未定义的行为。
  • 在实践中,使用 MSVC 可能很难链接您的程序。我很确定 MSVC 将成员访问编码为损坏的名称。

标签: c++ visual-c++ language-lawyer


【解决方案1】:

如果您尝试这样做,您将进入一个痛苦的世界。 Igor 的 cmets 基本回答了这个问题 - 类的二进制布局可能会改变,并且因为您违反了 ODR,所以行为是未定义的。虽然不能保证,但 MSVC 在实践中可能会出现问题,具体取决于修改后的类的使用方式。

实现这一点的更好方法是创建一个新类,它是您可能需要私有访问的任何类的朋友。此类只能在您的一个 cpp 文件中定义。还有很多工作要做,但是跟踪由于 UB 导致的随机崩溃需要很长时间。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2013-03-27
    • 2010-12-18
    相关资源
    最近更新 更多