2012-09-06 40 views
0

我不知道真的該怎麼尋找,試圖找到我的答案,所以請我重定向到任何相關的文章和我提前道歉。訪問私有數組從方法的對象在C++

我真的很新的C++,我試圖做一個3x3的CLI瓷磚遊戲。我可以將Tile對象分配給TileGame構造函數中的私有指針數組,並查看它們是否具有有效的內存地址(或者我認爲)。我的問題是當我運行方法嘗試訪問該數據時。它看起來像數組中的第一個元素有一個值,但其他人看起來很奇怪。我相信這是一件小事,但我對我做錯了什麼感到茫然。我也嘗試創建一個訪問器方法,但這似乎只會使事情複雜化。

#include <iostream> 
using namespace std; 

class Tile 
{ 
    private: 
     int position; 
     int tileID; 
    public: 
     Tile(int, int); 
}; 

// tile constructor 
Tile::Tile(int p, int id) : position(p), tileID(id) {} 

class TileGame 
{ 
    private: 
     const int MAX_TILES; 
     Tile* tiles[]; 
    public: 
     TileGame(); 
     void shuffle(); 
}; 

// game constructor 
TileGame::TileGame() : MAX_TILES(8) 
{ 
    Tile* tiles[MAX_TILES]; 
    for (int i = 0; i < MAX_TILES; i++) 
    { 
     tiles[i] = new tile(i, i); 
    } 

    // spit out the addresses for each 
    cout << endl << "From TileGame(): " << endl; 
    for (int i = 0; i < MAX_TILES; i++) 
    { 
     cout << tiles[i] << endl; 
    } 
} 

void TileGame::shuffle() 
{ 
    // spit out the addresses for each 
    cout << endl << "From TileGame(): " << endl; 
    for (int i = 0; i < MAX_TILES; i++) 
    { 
     cout << tiles[i] << endl; // <-- This seems to be the problem 
    } 
} 

int main() 
{ 
    TileGame* game = new TileGame(); 
    game->shuffle(); 
} 

這應該編譯(我不得不重新輸入,所以我希望我沒有犯錯),我得到的輸出是一樣的東西:

From TileGame(): 
0x7f9349c03aa0 
0x7f9349c03ab0 
0x7f9349c03ac0 
0x7f9349c03ad0 
0x7f9349c03ae0 
0x7f9349c03af0 
0x7f9349c03b00 
0x7f9349c03b10 

From shuffle(): 
0x7fff9502752c 
0x100 
0 
0 
0 
0 
0 
0 

我到達這個點的時候通過嘗試訪問tiles[]值,我不斷收到seg故障。思考?

+0

如果您將8大小分配給2d數組,爲什麼不在類中聲明它。 –

+0

您的代碼不能編譯。 – japreiss

回答

1

TileGame的構造函數中創建的tiles數組不是Game對象中的tiles數組。擺脫構造函數中的一個。

此外,也可能指針。 tiles數組可以容納Tile對象;不需要間接和new s。同樣,不需要game作爲指針。只需將其創建爲TileGame對象。

+0

要在數組中放置'Tile'對象而不是指針,您必須使'Tile'默認構造,或將數組更改爲向量並將它們放置到其中。我不確定哪個會是更小的邪惡。 –

+0

@MikeSeymour - 是的,它需要一個默認的構造函數。這比這裏的Java風格好得多。 –

+0

啊,所以它(最初)是構造函數數組的範圍問題。我想我在想,我需要一些如何設置最大數量的元素。 – jktravis

4

你的構造沒有做任何事情來初始化成員稱爲tiles;而是填充同名的本地數組。當構造函數退出時,這被丟棄,泄漏分配的內存。然後,當您嘗試使用未初始化的成員時,您會遇到未定義的行爲(在您的情況中爲分段錯誤)。

成員應該是一個指針,而不是一個數組,如果你不知道在編譯時的大小:

Tile ** tiles; 

分配如下:

tiles = new Tile* [MAX_TILES]; 

記得刪除每個圖塊(delete tiles[i])和陣列本身(delete [] tiles)在析構函數中;並像往常一樣在管理資源時記住Rule of Three

更妙的是,使用std::vector所以你不必自己管理的內存。一般來說,當你不需要時,你應該避免動態分配;例如,你TileGamemain創建可能是一個自動可變的(TileGame game;)來修復你那裏內存泄漏。

+1

+1,但如果我可以讓'vector'完成這項工作,我就可以得到+10。 –

+0

感謝您的建議。不過,我不太確定我是否明白應該使用什麼或如何應用這些。刪除構造函數'tiles []'不會產生我期待的結果。顯然,我有一個方法去。 – jktravis