Как настроить класс, в котором я могу иметь частный 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
в строке объявления карты.
Что я делаю не так?
Изменить: я бы предпочел избегать использования векторов, так как я еще не "изучил" их в этом классе. (узнав, что я имею в виду, что я знаю, как их использовать, но профессор не обсуждал их и не хотел, чтобы мы использовали внешние знания)
Вы можете использовать вектор.
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;
};
Я предлагаю использовать один из первых двух вариантов.
Массивы должны иметь свои размеры, определенные во время компиляции, а не время выполнения.
Вы должны выбрать другой контейнер, если хотите размер времени выполнения. Возможно:
- std::vector<bool> // and then simulate a 2d array using indexing
- std::vector<std::vector<bool>> // if you insist on using [][] syntax
[x + y * x_size]
чтобы получить индекс.
map
.