2012-09-06 3 views
0

검색을 위해 무엇을 검색해야할지 잘 모르겠습니다. 내 답변을 찾으려면 관련 기사로 리디렉션 해주십시오. 미리 사과드립니다.C++의 메소드에서 객체에 대한 포인터의 개인 배열에 액세스

저는 C++을 처음 접했고 3x3 CLI 타일 게임을 만들려고합니다. TileGame 생성자에서 개인 배열의 포인터에 Tile 개체를 할당하고 유효한 메모리 주소를 가지고 있는지 확인할 수 있습니다. 내 문제는 해당 데이터에 액세스하려고 시도하는 메서드를 실행할 때입니다. 배열의 첫 번째 요소에는 값이 있지만 다른 요소는 매우 이상하게 보입니다. 나는 그것이 작은 무엇인가라고 확신한다. 그러나 나는 잘못하고있는 것에 관해서 손실에있다. 또한 접근 자 메서드를 만들려고 시도했지만 복잡한 것만 보였다. 나는이 시점시에 도착

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

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

: 이것은 컴파일해야

#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(); 
} 

(. 나는 그것을 다시 입력했다, 그래서 내가 실수를하지 않은 희망) 내가 얻을 출력은 뭔가처럼 tiles[] 값에 액세스하여 계속 오류가 발생했습니다. 생각?

+0

2 차원 배열에 8 크기를 할당하는 경우 클래스에 선언하지 않는 이유는 무엇입니까? –

+0

코드가 컴파일되지 않습니다. – japreiss

답변

1

TileGame 생성자에서 생성 된 tiles 배열 Game 오브젝트의 배열 tiles 아니다. 생성자에서 제거하십시오.

또한 포인터 일 수 있습니다. 배열 tilesTile 개체를 저장할 수 있습니다. 간접 참조와 new 필요 없음. 마찬가지로 game이 포인터 일 필요는 없습니다. 그냥 TileGame 개체로 만듭니다.

+0

배열에 포인터가 아닌'Tile' 객체를 넣으려면'Tile'을 기본 구성 가능하게 만들거나 배열을 벡터로 변경하고 배열을 배치해야합니다. 나는 어떤 것이 더 나쁜 것인지는 잘 모릅니다. –

+0

@MikeSeymour - 예, 기본 생성자가 필요합니다. 자바 스타일의 사용법보다 훨씬 좋습니다. –

+0

아, 그래서 (처음에는) 생성자 배열의 범위 문제였습니다.나는 요소의 최대 개수를 설정하는 방법이 필요하다고 생각했다. – jktravis

4

생성자가 tiles이라는 멤버를 초기화하는 데 아무 것도하지 않습니다. 대신 같은 이름의 로컬 배열을 채 웁니다. 이것은 생성자가 종료 할 때 할당 된 메모리를 유출하여 버려집니다. 초기화되지 않은 멤버를 사용하려고하면 정의되지 않은 동작 (경우에 따라 세분화 오류)이 발생합니다. 당신이 컴파일시 사이즈를 모르는 경우

회원은 오히려 배열보다, 포인터이어야합니다 :

tiles = new Tile* [MAX_TILES]; 

것은 각 타일을 삭제하는 것을 잊지 마십시오 :

Tile ** tiles; 

처럼 할당 (delete tiles[i]), 소멸자의 배열 자체 (delete [] tiles); 항상 자원을 관리 할 때와 마찬가지로 Rule of Three을 기억하십시오.

메모리를 직접 관리 할 필요가 없으므로 std::vector을 사용하십시오. 일반적으로 동적 할당은 필요하지 않을 때는 피해야합니다. 예를 들어 main에 작성한 TileGame은 자동 누락 (TileGame game;) 일 수 있습니다.

+1

+1하지만, 만약에 '벡터'가 일을하도록 할 수 있다면 +10. –

+0

제안 해 주셔서 감사합니다. 나는 정확히 어떻게 또는 어떻게 적용 할지를 잘 모르겠다. 생성자'tiles []'를 제거하면 내가 기대했던 결과를 얻을 수 있습니다. 분명히 나는 ​​갈 방법이있다. – jktravis

관련 문제