簡體   English   中英

"打破 C++ 中的封裝"

[英]Breaking encapsulation in C++

有沒有辦法打破類封裝? 朋友關鍵字也可以用於相同的目的。 如果我使用朋友函數或類,那么我可以訪問它的所有公共和私有數據成員。 我想知道有沒有其他方法。這是我的面試問題之一,我用谷歌搜索了很多,但沒有找到令人信服的答案,希望有人能幫助我。 提前致謝。

"

我想說, friend不會破壞封裝。 參見https://isocpp.org/wiki/faq/Friends#friends-and-encap

現在讓我們忽略“封裝”實際上意味着什么的問題。 通常可以使用模板專門化技巧來訪問私有成員。 有關該類具有成員模板的基本思想, 請參見http://www.gotw.ca/gotw/076.htm

即使該類不包含模板,也可以將該方法擴展為訪問類的任何私有數據成員或私有成員函數。 參見http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.htmlhttp://bloglitb.blogspot.com/2011/12/access-to-private-members -safer.html

這取決於您破壞封裝的方式。 通常,對類外部的類成員執行的所有操作都可以視為破壞類封裝。

例如,返回non-const引用的getter可能會被視為破壞封裝,因為它們以這種方式公開私有類成員,您可以自由修改它們,並且對此過程幾乎沒有控制權。

是的,有。 如果該類具有公共模板成員函數,則可以將其專用於您自己的一種類型,並在其中進行所需的任何操作。

赫伯·薩特(Herb Sutter)有一本書討論了這種可能性和其他可能性。 IIRC,這是唯一具有標准一致性的。

什么可以做中C也可以在C++

您可以使用指向該類的指針,將其轉換為char * ,將其視為一個數組,然后使用所需的內容開始覆蓋內存,並調整所有私有成員變量。 即使有人使用pImpl慣用法試圖向您隱藏這些變量,也可以執行此操作。

他們說,這樣做通常是代碼臭味和嚴重邪惡的標志。通向地獄的道路鋪就了良好的意圖。 :)

但是總的來說,當您將變量或函數設為私有時,您實際上是在說“請不要碰這個”。 下次出現的程序員總是可以或多或少地完成他們想要的任何事情,而無需修改類定義。 “私有”和“公開”功能實際上只是意圖的陳述,是使想要違背您意圖的人感到不便的一種方法,並且是向不確定該在哪里尋找東西的人提供的指南。 就像您家門上的鎖-堅定的任何人都可以進入。

這不適合溫順的人,僅在極端和臨時情況下使用。 以下第 3 方標頭具有我需要更改的private<\/code>字段。

#define private public                                                                                         
#include "controllers/incremental_mapper.h"
#undef private

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM