【问题标题】:How can I Violate Encapsulation property?如何违反封装属性?
【发布时间】:2010-06-08 23:32:05
【问题描述】:

如何在不出现编译时错误的情况下违反封装属性? (在 C++ 中)

很好奇..

这实际上是我的一位教授提出的问题。请不要误解。 当我们讨论编译器错误时有人问过这个问题

【问题讨论】:

  • 你为什么要这样做?
  • 好奇心害死了你认识的猫……
  • 我认为这不值得-1。 +1 删除它。

标签: c++


【解决方案1】:
#define private public
#define protected public
#define class struct

你去 :-)

【讨论】:

  • template <class T> T youBrokeIt(const T& x) { return x; }
  • @ega:实际上,这只是一个玩笑。为什么有人想这样做?封装是个好东西!如果你真的需要触摸私处,那么你的设计就有缺陷,你必须重构。
  • 我的意思是这是一个很棒的笑话!我什至不会梦想将私有定义为公共。
  • 哦,你赢了。如果我见过一个邪恶的适当表现形式。除了...保护呢? :)
  • 好的。现在我们需要用火烧掉它。
【解决方案2】:

我假设“违反封装”是指“从类外部访问私有成员”。

据我所知,“合法”执行此操作的唯一方法是使用 friend classes / methods

但是,为了使用它们,您需要修改具有私有成员的类 - 此时将一些方法从 private 重新定义为 protectedpublic 可能会更简单,具体取决于案例。

【讨论】:

  • 朋友不会破坏封装,因为你可以选择你的朋友是谁。未经您的同意,不可能有人成为您的朋友。
  • 请看我的第一句话——我将“封装”定义为“无法从外部访问私有成员”。这不是“标准”或“完整”定义,但我怀疑这是 OP 在他的问题上使用的定义。
【解决方案3】:

你没有得到*。封装是 C++ 的一个特性。

**除非你做了一些黑暗、邪恶和魔法的事情。*

【讨论】:

【解决方案4】:

您更改定义相关类的标题以公开所需的成员。换句话说,您删除了封装。不要这样做。

【讨论】:

    【解决方案5】:

    设计一个镜像类,它与您尝试访问其非公共成员的类具有相同的成员,并将该类的对象硬铸到镜像类。

    class original
    {
      private: int x,y,z;
      public: int dosomething();
    };
    
    class mirror
    {
      public: int x,y,z;
    };
    
    int main()
    {
      original *o = new original;
      mirror *m = (mirror*)o;
      m->x = 10;
    }
    

    这当然不能保证有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多