2011-01-14 86 views
5

嗨,我在遺留代碼中磕磕絆絆,我遇到了一個奇怪的方法定義/聲明。我對它的作用有一個有教育的猜測,但我還不能100%確定。此方法聲明/定義是什麼意思? (與傳遞數組有關?)

聲明:

const SomeEnumeratedId (&SomeMethod() const)[SOME_CONSTANT_VALUE]; 

定義

const SomeEnumeratedId (&SomeClass::SomeMethod() const)[SOME_CONSTANT_VALUE] 
{ 
    return someMemberArray; 
} 

我最好的猜測是,它是傳遞一個參考someMemberArray,它是保證它的大小SOME_CONSTANT_VALUE的,但我從來沒有見過方法聲明出現後的[]符號,並且有很多圓括號。

任何幫助非常感謝。

回答

7

這是一個const成員函數的聲明,它不接受任何參數,並返回一個對數組的引用SOME_CONSTANT_VALUEconstSomeEnumeratedId s。

typedef看起來更容易理解。

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE]; 

SomeArrayType& SomeClass::SomeMethod() const 
{ 
    return someMemberArray; 
} 
+0

那麼方法告訴調用函數後,[SOME_CONSTANT_VALUE]返回的引用是否引用了該長度的數組?這是最讓我困惑的部分,因爲我從未在函數聲明中看到過這一部分。我只看到數組作爲引用或指針傳遞,最後沒有。 – Michael 2011-01-14 16:14:25

0

即怪異符號,如@Charles已經指出的是,返回到存儲爲部件元件的陣列的基準的恆定方法的聲明/定義。

的語法是相當奇怪的和可以(而且也許應該)通過一個typedef來簡化:

typedef SomeEnumerated array_t[SOME_CONSTANT_VALUE]; 
const array_t& SomeMethod() const; 
0

是啊,這是C'S完全向後類型聲明語法的結果。這與如何在執行數組typedef時類似,如下所示:typedef int myArrayType[3];[3]在新的類型名稱之後,而不是原始名稱。

如果你很聰明,你可以使用{std,tr1,boost}::array - 值得考慮的呢 - 讓你最終有:

array<SomeEnumeratedId, SOME_CONSTANT_VALUE>& SomeClass::SomeMethod() const; 

代替。

與typedefs(在其他答案中探討)的解決方法是相關的,雖然不完全等效爲{std,tr1,boost}::array是包裝,而不僅僅是typedefs。