我有一個GUI架構,其中元件火災事件,像這樣:訪問隱藏的「這個」指針
guiManager->fireEvent(BUTTON_CLICKED, this);
每一個事件燒製通行證「這個」作爲事件的調用者。從來沒有一次我不想通過'這',並進一步,沒有指針除了因爲'這個'應該通過。
這使我想到了一個問題:我如何可以斷言,fireEvent是從來沒有比「這個」其他指針,我怎麼能簡化(和同質化)調用fireEvent只是:
guiManager->fireEvent(BUTTON_CLICKED);
在這一點上,我想起一個相當常見的編譯器錯誤的,當你寫的東西是這樣的:
class A {
public:
void foo() {}
};
class B {
void oops() { const A* a = new A; a->foo(); }
};
int main() {
return 0;
}
編譯這會給你
In member function ‘void B::oops()’: error: passing ‘const A’ as ‘this’ argument of ‘void A::foo()’ discards qualifiers
因爲成員函數將'this'作爲隱藏參數傳遞。
「啊哈!」我說。這(沒有雙關語意圖)正是我想要的。如果我能以某種方式訪問隱藏的'this'指針,它將解決我前面提到的兩個問題。問題是,據我所知你不能(可以嗎?),如果可以的話,會出現「但它會破壞封裝!」除了我已經每次都傳遞'this'之外,它還有什麼可以突破的。
那麼,是還有一種方法可以訪問隱藏的'this',如果沒有任何習語或替代方法比每次傳遞'this'更優雅?
關於對'A :: foo'調用的錯誤信息中的'this'是成員函數被調用的'a'對象(該對象,它將在'A :: foo功能)。它不是指'B :: oops'中的'this'。 – sth 2010-04-14 16:31:04
我只是自己重讀錯誤,特別是它說「傳遞const A」的部分,並且實現了同樣的事情。有時候,非常非常小心地閱讀內容會有所幫助。所以我的'隱藏這個'指針的整個概念在開始時是錯誤的。噢,如果其他人對錯誤信息做出同樣的錯誤結論,我會留下未編輯的原始問題。 – Kyle 2010-04-14 16:37:14