2012-05-19 194 views
0

嗨,我知道有很多類似的問題,但我已經通過他們,我似乎無法讓我的功能工作。我需要返回一個指向2D數組的指針。到目前爲止我使用這段代碼:C++指針到二維數組

(此代碼是在Level.cpp函數)

TileType* CLevel::getTiles() 
{ 
TileType (*matrix_ptr)[31] = tiles; 

return *matrix_ptr; 
} 

(TileType是一個枚舉)此功能只返回一行,我顯然需要兩者。有什麼建議麼?

頭文件Level.h:

class CLevel 
{ 
private: 

list<CBox> boxes; 
TileType tiles[GRID_HEIGHT][GRID_WIDTH]; 
CPlayer player; 

public: 
CLevel(); 
~CLevel(); 

CPlayer* getPlayer(); 
list<CBox>* getBoxes(); 
TileType** getTiles(); 
}; 
+5

'tiles'是如何定義的? –

+0

瓷磚的定義如下:TileType瓷磚[GRID_HEIGHT] [GRID_WIDTH]; –

+0

你在哪裏定義它? – SurDin

回答

1

你應該做的要麼這是在兩種情況下getTiles()是該函數返回對二維數組瓷磚的引用(該示例顯示了兩種形式的語法)。致電getTiles()您實際上是指tiles。你甚至可以用這種方式調用它的功能:getTiles()[i][j]

+1

它可以工作,但我沒有看到很多地方這樣的結構將會有用。 – SurDin

+0

我已經使用了你在這裏寫的函數,並且出現'tiles'未定義的錯誤。我不明白我是如何得到這個錯誤:/我也得到一個錯誤,'函數返回數組是不允許的'。 另外我最終需要訪問數組的元素,所以我需要調用你寫的函數:getTiles()[i] [j]。 (我正在使用這個函數來爲推箱子游戲在一個數組中存儲瓷磚) –

+0

那麼它在gcc-4.3.4上爲我編譯,參見[this](http://ideone.com/TkCqJ)。你使用什麼編譯器? –

-1

如果你想返回一個指向一個二維數組,那麼你的函數聲明應該是:

TileType** CLevel::getTiles() 

以及返回應matrix_ptr,而不是它的指針內容(這是一維數組)。

// Class declaration 
class CLevel 
{ 
public: 
    TileType (*getTiles())[GRID_WIDTH]; 

    TileType tiles[GRID_HEIGHT][GRID_WIDTH]; 

    //... 
}; 

// Implementation 
TileType (*CLevel::getTiles())[GRID_WIDTH] 
{ 
    return tiles; 
} 

或本:

// Class declaration 
class CLevel 
{ 
public: 
    TileType (&getTiles())[GRID_WIDTH][GRID_HEIGHT]; 

    TileType tiles[GRID_HEIGHT][GRID_WIDTH]; 

    //... 
}; 

// Implementation 
TileType (&CLevel::getTiles())[GRID_WIDTH][GRID_HEIGHT] 
{ 
    return tiles; 
} 

這是一個有點複雜的聲明,但裏面讀出來:

return matrix_ptr; 
+0

當我這樣做時,我得到一個錯誤:返回值類型不匹配函數類型 –

+0

那麼,你的matrix_ptr聲明如何? –

+0

@RicardPérezdelCampo'matrix_ptr'在'getTiles'中定義。 –

2

不要定義getTiles()。

你完全打破了這個類的封裝。這並不總是很重要,但在這種情況下,C/C++二維數組不適用於外部傳遞,其尺寸可能不明確。

因此,將tile上的操作定義爲CLevel的方法。

+0

設計可能有缺陷,但這與所問的問題無關 –