Создание 2D массива на конструкции с переменной длиной

0

Как настроить класс, в котором я могу иметь частный 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
    Предложение - не называйте свою переменную map .
  • 0
    Массивы в стиле C очень требовательны, поэтому мы советуем людям не использовать их. Если ширина и высота действительно известны во время компиляции, массивы можно заставить работать.
Показать ещё 4 комментария
Теги:
arrays

2 ответа

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
    Я уже выполнил «моделирование двумерного массива с использованием индексации» со стандартным массивом, но я бы предпочел сделать это «правильным способом» и использовать реальный двумерный массив. Я озадачен тем, что C ++ исключает размеры, определенные во время выполнения для массивов
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню