2012-01-04 4 views
2

C++ (미로)에서 작고 간단한 게임을 구현해야하며 지금 당장 문제가 있습니다.오브젝트 포인터가있는 C++ 벡터

일부 조각 : 나는 필요 미로를 만들 때

for (n = 0; n < MAZE_WIDTH; n++) { 
    this->maze[n] = new Field*[MAZE_HEIGHT]; 
    for (p = 0; p < MAZE_HEIGHT; p++) { 
     this->maze[n][p] = new Field(); 
     this->maze[n][p]->x = n; 
     this->maze[n][p]->y = p; 
    } 
} 

: 나는 미로 미로의

Field*** maze; 

초기화 내 필드를 나타내는 객체 포인터의 배열을 가지고 이미 방문한 필드 목록과 스택 이렇게 :

std::vector<Field*> visited; 
std::vector<Field*> stack; 
,210

그런 다음 나중에 내 스택

stack.push_back(neighbour); 

에 필드 *를 데려 가고 싶다는하지만 푸시 후 객체의 모든 값은 잘못이다. 이미이 주제에 대한 몇 가지 스레드를 빨간색

내가하려고해도

neighbour = stack.back(); 

모든 값은 completly 다른 내가 포인터가 아닌 객체의 벡터를 선택한 이유입니다.

내 잘못은 어디입니까?

편집 : 좀 더의 요청에 따라 미리보기 : 나는 메이트 자체

this->maze = new Field**[MAZE_WIDTH]; 

필드에 메모리를 할당 물론

보이는 간단한 클래스입니다 같은 :

class Field { 
public: 
    Field(); 
~Field(); 
bool w_left; 
bool w_right; 
bool w_front; 
bool w_back; 
unsigned int x; 
unsigned int y; 
private: 
}; 
+0

스택에 추가 할 때마다 동일한 Field 참조를 우연히 수정하지 않습니까? 그러면 모든 값이 동일하게되고 마지막으로 추가 된 값과 동일하게됩니다. – Tudor

+3

좀 더 코드를 줄 수 있습니까? 'neighbour'의 유형은 무엇입니까? 어떻게 초기화됩니까? (로컬 변수에 대한 포인터를'vector'에 삽입하는 것처럼 들리지만 더 많은 코드가 없으면 말할 수 없습니다.) –

+0

코드 스 니펫 일 수 있지만,'new Field ** [ ]'처음에는? 또한, 포인터에 대한 포인터에 대한 포인터보다 다차원 배열을 처리하는 더 간단한 방법이 있다고 생각합니다. – slaphappy

답변

2

당신이 값을 획득하는 방법의 코드를 게시하지 않았다 때문에, 이에 비교하고, 문제를 찾아보십시오 ...

std::vector<std::vector<Field*> > maze; 

    // Ini 
    for(int i = 0; i < MAZE_WIDTH; i++) 
    { 
     maze.push_back(std::vector<Field*>()); 
     for(int j = 0; j < MAZE_HEIGHT; j++) 
     { 
      maze[i].push_back(new Field()); 
      maze[i][j]->x = i; 
      maze[i][j]->y = j; 
     } 
    } 

    std::vector<Field*> visited; 

//이 필드 [4 밀어 5] 방문한 벡터

visited.push_back(maze[4][5]); 


    // Clean up 
    for(size_t i = 0; i < maze.size(); i++) 
    { 
     for(size_t j = 0; j < maze[i].size(); j++)  
      delete maze[i][j];  
    } 
+0

그래도이 솔루션으로 끝났습니다 _) – soupdiver

0

왜 미로를 Field***으로 선언 하시겠습니까?

C++ 대안은 std::vector<std::vector<Field*> > maze;이며이를 사용해야합니다.

+2

또는 더 나은 :'std :: vector >> maze' C++ 11이 사용 가능하거나'boost :: shared_ptr' /'std :: tr1 :: shared_ptr'대신에'shared_ptr'을 사용합니다. – codeling

+2

더 나은 : MAZE_HEIGHT 및 MAZE_WIDTH 상수 => 필드 미로 [MAZE_WIDTH] [MAZE_HEIGHT] ;. 그럼 당신은 벡터에 삽입해야합니다 stack.push_back (& ​​maze [x] [y]); – Errata

+0

내가 말했듯이 미로를 선언했지만'stack.push_back (이웃)'을 시도 할 때 여전히 같은 오류가 발생합니다 – soupdiver