嗯,我不確定你的教授的意思,我有一些想法。
首先,這樣的代碼可以是「不那麼明顯」:
someObjectPointer->foo()->bar()->foobar()
你不能真的說什麼是foo()
的結果,這樣的話你真的不能說上什麼是bar()
被調用。這是同一個對象嗎?或者,也許它正在創建一個臨時對象?或者也許是別的?
另一件事是如果你必須重複你的代碼。考慮這樣一個例子:
complexObject.somePart.someSubObject.sections[i].doSomething();
complexObject.somePart.someSubObject.sections[i].doSomethingElse();
complexObject.somePart.someSubObject.sections[i].doSomethingAgain();
complexObject.somePart.someSubObject.sections[i].andAgain();
這樣的比較:
section * sectionPtr = complexObject.somePart.someSubObject.sections[i];
sectionPtr->doSomething();
sectionPtr->doSomethingElse();
sectionPtr->doSomethingAgain();
sectionPtr->andAgain();
你可以看到第二個例子是如何不僅短,而且更容易閱讀。
有時候的功能鏈更容易,因爲你並不需要它們返回什麼打擾:
resultClass res = foo()->bar()->foobar()
VS
classA * a = foo();
classB * b = a->bar();
classC * c = b->foobar();
另一件事是調試。調試函數調用的長鏈非常困難,因爲您根本無法瞭解其中哪些導致錯誤。在這種情況下,打破鏈有很大幫助,更何況你可以做一些額外的檢查太像
classA * a = foo();
classB * b;
classC * c;
if(a)
b = a->bar();
if(b)
c = b->foobar();
因此,要總結,你不能說這是一個「壞」或「好「風格一般。你必須首先考慮你的情況。
我從來沒有聽說過。我能看到的唯一好處是,如果你從空指針中得到一個錯誤,你可以通過行號來判斷它是否是取消引用,並且在調試器中檢查中間指針稍微容易一些。但是,如果存在空解除引用的危險,則應在第二行之前明確檢查它。不,我看不到一個很好的理由。 – Rup 2012-07-10 13:10:37
調試一件事比較容易。測試終端是否爲空更簡單。 – 2012-07-10 13:10:56
也許是因爲當你有一個空指針被解引用並且試圖找出哪一個時會有所幫助。這樣,當你理解錯誤行時(例如從調試器)你將知道它是哪個指針) – Mohammad 2012-07-10 13:11:03