2010-06-08 39 views
0

如何在没有编译时错误的情况下违反封装属性? (在C++)如何违反封装属性?

只是很好奇..

这实际上是由我的教授中有一位问一个问题。请大家不要误解。 当我们对编译器错误进行了讨论时,询问了这个问题。

+0

你为什么要这么做? – 2010-06-08 23:36:55

+0

好奇心杀死了猫你知道... – 2010-06-08 23:56:27

+1

我不认为这是值得-1。 +1将其删除。 – kikito 2010-06-10 08:02:44

回答

7
#define private public 
#define protected public 
#define class struct 

你去那里:-)

+1

'template T youBrokeIt(const T&x){return x; }' – kennytm 2010-06-09 08:50:48

+0

这太棒了。 +1 – kikito 2010-06-09 09:02:03

+0

@ega:实际上,这只是一个笑话。为什么有人想要这样做?封装是一件好事!如果你真的需要碰到私人部件,那么你的设计是有缺陷的,而且你必须重构。 – fredoverflow 2010-06-09 09:09:49

1

您没有得到*。封装是C++的一项功能。

**除非你做一些黑暗,邪恶,和魔术。*

+0

请参阅[FredOverflow的答案。](http://stackoverflow.com/questions/3002101/how-can-i-violate-encapsulation-property/3004223#3004223)他是这种邪恶的表现。 :) – 2010-06-09 17:14:38

+0

另请参阅[evil:adj。 (来自Jargon文件。)](http://catb.org/jargon/html/E/evil.html) – 2010-06-09 17:16:37

1

您更改定义有问题的类进行所需的公众成员的标题。换句话说,你移除了封装。不要这样做。

2

我会认为是“破坏封装”你的意思是“从类外部访问私有成员”。

我知道使用friend classes/methods“合法”做到这一点的唯一方法。

然而,为了使用它们,你将需要修改其具有私有成员的类 - 此时它可能比较简单,只是重新定义从private一些方法来protectedpublic,视情况而定。

+0

朋友不会破坏封装,因为你可以选择你的朋友是谁。没有你的同意,不会有人可以成为你的朋友。 – fredoverflow 2010-06-09 09:16:06

+0

请看我的第一句话 - 我将“封装”定义为“无法从外部访问私人成员”。这不是一个“标准”或“完整”的定义,但我怀疑这是OP在他的问题上使用的那个。 – kikito 2010-06-09 09:19:41

0

设计一个镜像类,该类与您试图访问非公共成员的类具有相同的成员,并将该类的对象强制转换为镜像类。

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; 
} 

这当然不能保证工作。