2016-03-04 141 views
0

我想爲我的二維指針數組定義一個類型,所以我可以減少我的代碼中的混亂。我有三分球,所以我認爲這看起來很糟糕。 我設法使用typedef重構代碼,但它更像是試驗和錯誤。我想知道這是什麼,其實就是:Typed二維指針陣列

typedef SomeClass* (&grid8x8)[8][8]; 

爲什麼這個函數返回OK值:

grid8x8 SomeOtherClass::getGrid() 
{ 
    return grid; 
} 

在這種情況下的typedef的語法是什麼困惑我。

+3

閱讀有關[順時針/螺旋規則(http://c-faq.com/decl/spiral。 anderson.html)並重試。 –

+0

哦,我強烈建議你從類型別名定義中刪除'&'。這會導致無法使用引用的時間和地點出現問題。 –

+0

@JoachimPileborg grid8x8是對SomeClass類型的指針的8x8數組的引用嗎? – omegasbk

回答

2

typedef表示:grid8x8是對指向SomeClass的8x8指針陣列的引用。

SomeOtherClass::getGrid函數是,我想像,返回一個引用,然後返回成員變量SomeOtherClass::grid

我會做它,而不是這樣:

typedef SomeClass* (grid8x8)[8][8]; 


const grid8x8& SomeOtherClass::getGrid() 
{ 
    return grid; 
} 

這樣的話,你可以有一個grid8x8或爲grid8x8參考。有一點更靈活,你就不太可能你使用的倍基準當你shouldn't.`

+0

詹姆斯根,很好的捕獲。 –

1

這裏是一個C++ 11的回答(問題是畢竟標記C++)

忘記

您可以使用std::array來存儲網格而不是C數組。根據您對模板的偏好,語法有些簡單。

#include <array> 
typedef std::array<std::array<SomeClass*, 8>, 8> grid8x8; 
+0

我想到後來爲了適應C++ 11而重構代碼,所以我認爲這非常有用。謝謝! – omegasbk

0

它是由指針8陣列([8][8])(*)爲整數(int)的參考((&))到8。從右到左開始解析最內部的括號,然後再到右側,最後再到左側。與此相反,由8陣列整數的一個指針引用一個8是這樣的:

typedef int (*& RefToPtrToGrid)[2][2]; 

個人而言,我發現C++ 11風格更加易讀:

using RefTo8x8GridofPtr = int* (&) [8][8]; 

//or even better with std::array 
using Grid8x8 = std::array<std::array<int*,8>,8>&; 

//or, more flexible: 
template<size_t M,size_t N> 
using Grid = std::array<std::array<int*,N>,M>&; //usage: Grid<8,8> myGrid; 

而且,如@Will布里格斯說,你可能不希望使該類型的參考部分:

using Grid8x8 = int* [8][8]; 
//... and so on