如何设置一个类,我可以拥有一个私有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 first
和array 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
。
我做错了什么?
修改 我宁愿避免使用向量,因为我还没有在本课程中“学习”它们。 (通过学习,我的意思是我知道如何使用它们,但教授没有讨论它们,也不喜欢我们使用外部知识)
答案 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