在构造上创建具有可变长度的2D阵列

时间:2014-11-07 00:45:22

标签: c++ arrays

如何设置一个类,我可以拥有一个私有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];
        }
};

我在invalid use of non-static data member ‘World::WIDTH’行上获得了const int WIDTH,在地图申报行上获得了一个非常无用的error: from this location

我做错了什么?

修改 我宁愿避免使用向量,因为我还没有在本课程中“学习”它们。 (通过学习,我的意思是我知道如何使用它们,但教授没有讨论它们,也不喜欢我们使用外部知识)

2 个答案:

答案 0 :(得分: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;
};

我建议使用前两个选项中的一个。

答案 1 :(得分:0)

数组必须在编译时确定其大小,而不是运行时。

如果您想要运行时调整大小,则应选择其他容器。可能:

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