2014-11-07 2 views
0

크기가 비공개 2D 배열을 가질 수있는 클래스는 생성자를 통해 전달 된 변수에 의해 어떻게 결정됩니까?가변 길이의 생성시 2D 배열 만들기

class World { 
    private: 
     const int WIDTH; 
     const int HEIGHT; 
     bool map[][]; 
    public: 
     World(const int MAX_X, const int MAX_Y) : WIDTH(MAX_X), HEIGHT(MAX_Y) { 
      map = new bool[WIDTH][HEIGHT]; 
     } 
}; 

하지만이 경우에도 방법 declaration of ‘map’ as multidimensional array must have bounds for all dimensions except the firstarray size in operator new must be constant에 대한 오류의 무리를 얻을 :

나는 이것을 시도했습니다.

class World { 
    private: 
     const int WIDTH; 
     const int HEIGHT; 
     bool map[WIDTH][HEIGHT]; 
    public: 
     World(const int MAX_X, const int MAX_Y) : WIDTH(MAX_X), HEIGHT(MAX_Y) { 
      //map = new bool[WIDTH][HEIGHT]; 
     } 
}; 

내가 const int WIDTH 라인과지도 선언 라인에 error: from this location 꽤 쓸모에 invalid use of non-static data member ‘World::WIDTH’를 얻을 : 하나

나는 또한이 방법을 시도했지만 작동하지 않았다.

내가 뭘 잘못하고 있니?

편집 : 나는이 클래스에서 아직 학습하지 않았기 때문에 벡터를 사용하지 않는 것이 좋습니다. (배운 것은 내가 그들을 사용하는 방법을 알고 있지만 교수는 그것들에 대해 토론하지 않았고 외부 지식을 사용하는 것을 좋아하지 않는다)

+0

제안 - 변수의 이름을'map'으로 지정하지 마십시오. – PaulMcKenzie

+0

C 스타일 배열은 매우 까다 롭습니다. 그래서 우리는 사람들에게 사용하지 말 것을 권고합니다. 컴파일시에 너비와 높이를 알고 있으면 배열을 만들 수 있습니다. –

+0

지도 이름을 지정하지 않아야하는 이유는 무엇입니까? 그리고 치수는 공사가 아니라 이전에 알려졌습니다. – Malfist

답변

1

당신은 벡터를 사용할 수 있습니다.

class World 
{ 
    typedef std::vector<bool> Tiles; 
    typedef std::vector<Tiles> WorldMap; 

    World(unsigned int width, unsigned int height) 
    { 
    for (unsigned int i = 0; i < width; i++) 
    { 
     m_map.push_back(Tiles(height)); 
    } 
    } 

private: 
    WorldMap m_map;  
}; 

또는 컴파일시 세계 크기를 알고있는 경우 템플릿을 사용할 수 있습니다.

template <unsigned int Width, unsigned int Height> 
class World 
{ 
private: 
    bool m_map[Width][Height]; 
}; 

2d 배열은 실제로 배열에 대한 포인터 배열이므로 원시 포인터를 사용할 수도 있습니다.

class World 
{ 
    // Make sure you free this memory. 
    World(unsigned int width, unsigned int height) 
    { 
    m_map = new bool*[width]; 
    for(unsigned int i = 0; i < height; ++i) 
    { 
     m_map[i] = new bool[width]; 
    } 
    } 

private: 
    bool** m_map; 
}; 

첫 번째 두 가지 옵션 중 하나를 사용하는 것이 좋습니다.

0

배열의 크기는 컴파일 타임에 결정되고 런타임에는 결정되지 않아야합니다.

런타임 사이징을 원하면 다른 컨테이너를 선택해야합니다. 가능 :

- std::vector<bool> // and then simulate a 2d array using indexing 
- std::vector<std::vector<bool>> // if you insist on using [][] syntax 
+0

색인을 생성하려면 '[x + y * x_size]'를 사용하여 색인을 얻으십시오. –

+0

나는 표준 배열을 사용하여 "색인 생성을 사용하여 2 차원 배열을 시뮬레이트"했으나 "올바른 방법"을 수행하고 실제 2 차원 배열을 사용하는 것을 선호합니다. 나는 C++의 런타임 배제에 당황했다. 배열의 크기를 결정했다. – Malfist

+0

@Malfist - 문제는 배열을 선언 할 때 컴파일시 제공된 크기로 스택에 메모리를 할당해야한다는 것이다. C++은 런타임에 빌드 된 2D 배열을 '제외'하지 않으며 다른 방식으로 수행해야합니다. – Aesthete