2010-06-08 47 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; 
} 

這當然不能保證工作。