2011-01-14 51 views
6

我知道它們之間有什麼區別以及它們是如何工作的,但這個問題更多地是關於編碼風格。指針與類中的變量

每當我編碼時,我做了很多類,它們都有變量,其中一些是指針,一些是正常變量。

engine->camera.somevar->x; 
// vs 
engine->camera->somevar->x; 

我不喜歡在中間點:如果會員持續只要類做但後來我的代碼變成這樣我通常喜歡變量的指針。或與私有變量:

foo_.getName(); 
// vs 
foo_->gatName(); 

我認爲,點「消失」在一個長的代碼。我發現- >在某些情況下更容易閱讀。

我的問題是如果你使用指針,即使變量將在構造函數中創建並在析構函數中被刪除?在這種情況下是否有任何風格建議?

P.S.我認爲在某些情況下,點看起來更好。

回答

5

首先暴露成員變量是不好的形式。

其次,你的類可能永遠不應該容器指針。包含業務邏輯的類不應該有指針(因爲這意味着它們也包含指針管理代碼,並且指針管理代碼應該留給沒有業務邏輯但是專門用於管理指針的類(智能指針和容器)

指針管理類(智能指針/容器)應該設計爲管理單個指針。管理多個指針比預期的要困難得多,我還沒有找到一種情況,額外的複雜性付出

最後公共成員不應該公開底層實現(你笑即使通過getters/setter也不提供對成員的訪問)。這將接口緊密地綁定到實現上。相反,您的公共接口應該提供一組可以在對象上執行的操作。即方法是verbs

在C++中很少見到指針。
它們通常隱藏在其他類中。但是您應該習慣使用->.的混合物,因爲這一切都取決於上下文以及您想傳達的內容。只要代碼乾淨可讀,它就不重要。

個人補遺:

我恨_在那麼你的標識符結束它使。 disapear foo_.getName()我認爲它看起來好了很多,因爲foo.getName()

0

如果「embedded」結構與「父」結構具有完全相同的生命週期,並且在其他地方沒有引用它,我寧願將它作爲成員來使用,而不是使用指針。生成的代碼效率稍高一些,因爲它可以節省大量對內存分配器的調用,並且避免了大量的指針取消引用。

它也更容易處理,因爲指針相關的錯誤的機會減少。

另一方面,如果嵌入式結構有可能在其他地方被引用,我傾向於使用單獨的結構和指針。這樣我就不必重構我的代碼,如果事實證明嵌入式結構需要從其父節點中取出。

編輯:

我想這意味着我通常與指針替代去:-)

編輯2:

是的,我的回答是假設你真的想(或有)在兩者之間進行選擇即你編寫C風格的代碼。適當的面向對象的訪問類成員的方法是通過get/set函數。

但是,對於是否包含實際的類實例或指向/的引用,我的評論可能仍然有效。

+0

成員,但是,可能導致大的物體,並導致內存碎片問題出現 – user396672 2011-01-14 12:22:17

0

理想情況下,你不應該使用:你應該使用getter/setter方法。性能命中率很低(無論如何,編譯器可能會優化它)。

第二個考慮因素是使用指針是一個通常很危險的想法,因爲在某些時候你可能會搞砸它。

如果這些都不讓你感到迷惑,那麼我會說剩下的只是個人喜好的問題。

+2

的getter/setter是不好的設計,因爲它暴露了實現,因此將你耦合到它(它比耦合更少耦合e變量但仍然有很多不足之處)。 – 2011-01-14 10:19:55

+0

這是什麼讓人想要的,這不包括在這,例如? http://stackoverflow.com/questions/2747721/getters-and-setters-are-bad-oo-design換句話說,爲什麼你覺得從來沒有一個他們有用的情況? – Kricket 2011-01-14 13:36:34

1

你不應該讓你的選擇,因爲你會發現「 - >」更容易閱讀:) 使用一個成員變量通常是更好,因爲你不能用你犯錯指針。

這就是說,使用一個成員變量迫使你公開你的實現,因此你必須使用引用。但是,然後你必須初始化然後在你的構造函數,這並不總是可能的...

解決方案是使用std :: auto_ptr或boost :: scoped_ptr類似的智能指針。在那裏,您將獲得兩種解決方案的優勢,而且幾乎沒有什麼缺點。

MY2C

編輯:

一些有用的鏈接:
Article on std::auto_ptr
boost::scoped_ptr
Pimpl : private implementation