2013-05-25 2 views
0

안녕하세요 저는 C++에서 OO 디자인을 사용하여 간단한 팩맨을 작성하고 있습니다. 2D 배열의 내용을 표시하는 데 문제가 있습니다. 배열은지도/미로의 벽을 나타내는 많은 기호를 유지합니다.OO 디자인에서 다차원 배열을 표시하는 방법 C++

Game.h

class Game 
{ 
private: 
    char map; 
public: 
    Game(); 
    void displayMap(); 
}; 

char map[10][20] = {...}; 

void Game::displayMap() 
{ 
    for(int i = 0; i < 10; i++) 
    { 
     for(int j = 0; j < 20; j++) 
     { 
      cout << map[i][j] << " "; 
     } 
     cout << endl; 
    } 

} 

컴파일러는 오류를 나타납니다 Game.cpp

[i]에서 "expression must have pointer-to-object type" 말 : 여기에 내가 쓴 샘플 코드입니다.

그러나 생성자

Game.h

class Game 
{ 
private: 
    char map[10][20]; 
}; 

Game.cpp

Game::Game() 
{ 
    char map[10][20] = {...}; 
} 

그것은을 정의 할 때 나는 헤더 파일에 배열의 크기를 정의하고 그 값을 할당하는 경우 컴파일하지만 배열의 내용을 표시하려고 할 때 (displayMap()의 동일한 코드를 사용하여), 나는 그것이 정크로 가득하다는 것을 알았다. 나는 그 할당이 과제가 아니기 때문이라고 생각합니다. 실제로 스택상의 다른 배열을 초기화하므로 생성자가 완료된 후에 배열이 소멸되고 그 때 displayMap()에 원래의 할당되지 않은 배열이 표시됩니다.

내가 틀릴 수도 있으므로 저를 고쳐주십시오. 나는 그래서 당신이 외부를 숨기 인스턴스 변수의 같은 이름의 지역 변수를 재 선언이 문제 여기

+0

죄송합니다, 나는'문자지도 [10] [20]을 보았다고 생각 = {.. .};'두 번째 헤더의 헤더에. * 그 * 잘 작동합니다. 'std :: array'를 사용하는 것이 훨씬 쉽습니다. – chris

답변

1
Game::Game() { 
    char map[10][20] = {...}; 
} 

을 피하기 위해 내 게임을 구성하는 방법에 대한 추천이 필요합니다. 또한 이전에 선언 된 배열에 할당하려고합니다. C++에서는 불가능합니다. 나중에 배열을 선언 할 때 배열을 초기화 할 수 있습니다.

class Game { 
    char map[W][H] = { ... }; 
} 

또는 당신은이 작업을 수행 할 수 있습니다 :

(당신이 C++ 11 지원이있는 경우)이 작업을 수행 할 수

class Game { 
    char map[W][H]; 

    Game() { 
    char tmp[W][H] = { ... }; 
    memcpy(map, tmp, sizeof(char)*W*H); 
    } 
} 

는 더 나은, 당신은 std::copy를 사용할 수 있습니다. 아니면 심지어 더 나은 그냥 std::array을 사용하고 정상적인 배열을 잊어 버려.

+0

C++에서는 헤더 파일의 데이터 멤버를 초기화 할 수 없습니다. 그래서 첫 번째 해결책은 효과가 없습니다. – user2345939

+0

@ user2345939 : C++ 11에서는이를 수행 할 수 있습니다. 그리고 현재 승인 된 표준이므로 제외하지 않아도됩니다. – Jack

0

나는 귀하의 질문에 댓글을 달았지만 대답을하는 것이 좋을 것이라고 생각합니다. 그래서 여기 있습니다.

두 번째 옵션은 정상적으로 작동합니다. C/C++에서는 가비지 값이 정상입니다.

당신이해야 할 일은 생성자 (Game :: Game()) 내에서 값을 초기화하는 것입니다. 생성자는 이러한 경우에 사용하기위한 것입니다.

C/C++의 동작은 기본값을 지정하지 않고 "RAM에있는 것을 가져옵니다". 다른 언어들도 RAM 셀을 초기화합니다. 그것은 모두 당신이 사용하고있는 프로그래밍 언어에 달려 있습니다.(다른 일을 위해 [] []지도에 액세스하기 전에) 생성자 내부에이 코드를 포함

작동합니다 :

for (int ix = 0; ix < 10; ix++) 
    for (int jx = 0; jx < 20; jx++) 
     map[ix][jx] = "x"; // x will be your default value 
+0

당신은 당신의 대답을 좀 더 정교하게 만들 수 있습니까? 내 생성자 안에 중첩 된 for 루프를 포함하면 오류가 발생합니다. "const char *"형식의 값을 char 형식의 엔터티에 할당 할 수 없습니다. – user2345939

+0

오, 죄송합니다. 당신이 원하는 것은 문자열의 2 차원 배열을 만드는 것입니다. 문자열은 기본적으로 다른 문자 배열이므로 char * map [10] [20]과 같이 선언하십시오. 또 다른 방법은 map [ix] [jx] = 'x'; (작은 따옴표, 큰 따옴표 (문자열에 사용됨) 대신 char에 사용). 이것이 도움이되는지 알려주십시오. –

관련 문제