2013-07-09 60 views
1

我最近偶然發現了兩種不同的方式來表示派生類中基類的變量。我知道,這是一個非常主觀的問題,但我想聽到/論據反對的兩種不同形式的下列語法...繼承的C++範圍解析使用

版本1:

// in some code in the derived class... 
base_class_member_variable_ = 0xBEEF; 

版本2:

// in some code in the derived class... 
MyBaseClass::base_class_member_variable_ = 0xBEEF; 

另外,第2版的延伸,當所述基類是在不同的命名空間:

// in some code in the derived class... 
base_namespace::MyBaseClass::base_class_member_variable_ = 0xBEEF; 

我想知道如果明確聲明變量來自哪裏,如果它沒有在派生類中聲明/定義是有意義的。兩種版本都可以編譯,所以我們只是在這裏談論風格。

我明白這個話題是非常主觀的。然而,我真的想要改善自己的編程實踐,而沒有任何現有職位可以使用C++經驗的高級工程師。先謝謝您的幫助。

+0

我不會冒昧提出意見,但總的來說,爲了幫助您學習如何改進您的代碼,我建議您閱讀Bruce Eckel的2卷標題爲「Thinking in C++」。他們可以從圖書銷售商處購買,也可以免費在布魯斯的網站上下載**:http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html – CXJ

+0

感謝您的提示!我一定會檢查出來。 –

回答

1

所有額外範圍的內容都只是清楚瞭解編譯器能夠推斷出什麼。因此,除非有特別含糊的情況,否則不需要在那裏放置所有的範圍。

至於什麼是最好的風格,並幫助他人更好地瞭解代碼...我要避免這一點,因爲它來危險地接近渲染一個無法支持的意見。然而,我會說我常見的是1)人們不會使用更多的範圍修飾符來消除歧義,2)人們通常具有編碼標準(比如命名約定)如何引用成員變量至。例如,它們可以用前綴「m_」開始所有的成員變量,也可以在每次引用成員變量時使用「this->」。當然,並不是每個人都這樣做,但在我看來這是比較常見的做法。

這就是說,如果你在自己的工作,那麼你可以爲你做任何工作。另一方面,如果你在一個大羣體中工作,那麼你應該找出這個羣體的編碼風格約定,並遵循這些約定。

+0

這真的是我的主要問題。我正在自己的工作,所以我想制定一套我可以遵循的標準,這些標準在整個行業都有使用。到目前爲止,我只能找到Google C++風格指南並一直關注它。我計劃在幾個月內離開我目前的工作,所以我不想養成在我下一次冒險時會讓我笑出房間的壞習慣。不過,謝謝你的回答。 –

+0

請注意,有一種情況需要'Base :: m'或'this-> m'來使代碼正常工作。當一個類模板繼承於依賴類型時,成員訪問必須是合格的,以便將它們標記爲依賴關係,以便在對象中查找它們。否則,編譯器將無法解析符號。例如:'struct foo {int m; };模板 struct bar:B {bar(){this-> m = 0; }}; bar b;'如果你忽略'this->',你會得到一個錯誤。 –

+0

@ It'sPete谷歌風格指南是一個很好的開始。如果你遵循這一點,我就不會爲其他細節而煩惱......你可以反思自己的代碼和關於你認爲什麼更好或更壞的事情......但要記住要靈活,所以你可以適應到新工作場所/項目的編碼標準,無論它們是什麼。 (例如,某些地方需要匈牙利語法,而其他地方則根本不使用它 - 隨時準備採用這種方式和其他風格的細節。)我猜我在說,這聽起來像你想要的實際上沒有任何習慣。 :) –

0

經過多一點研究,看起來我的問題可能是一個有爭議的問題。由於我自己(或者至少試圖......)使用Google C++風格指南,所以所有成員變量都應該是私有的。因此,上面的例子都不應該存在於我的代碼中,除非可能訪問與該類綁定的常量。在這種情況下,明確說明常數來自何處可能是有意義的。

再次感謝您的答案,讓我們放心和精彩的討論。

+1

請注意,範圍解析不僅適用於成員變量。同樣的問題可以應用於成員函數或成員類型,它們都是常規的「公共」。 –

+0

感謝您指出這一點! –