Как сделать элемент двухмерного массива в классе, а затем указать его размеры в конструкторе? - PullRequest
0 голосов
/ 01 декабря 2019

У меня есть класс для моего движка консольной игры, в нем есть массив символов для карты. В конструкторе я хочу взять параметры для высоты и ширины карты (карта является массивом). Я попытался объявить и создать экземпляр массива в конструкторе, однако этот массив удаляется после завершения конструктора. вот как это выглядело:

class ConsoleGameEngine {
public:
    ConsoleGameEngine(mapheight, mapwidth) {
        char map[mapheight][mapwidth];
    }
}

это не позволяло другим методам получать доступ к массиву карты, поскольку он был уничтожен, когда конструктор завершил работу. Я хочу сделать что-то вроде этого:

class ConsoleGameEngine {
public:
    char map;
    ConsoleGameEngine(mapheight, mapwidth) {
        map[mapheight][mapwidth];
    }
}

Я не хочу использовать векторы, я хочу использовать обычные массивы. Спасибо за чтение.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2019

Просто дополнение к ответу @ AlexanderZhang.

Наименее плохой способ - использовать базовый 1D-вектор, который будет обрабатывать динамическое управление памятью. Но, к сожалению, C ++ имеет поддержку no для чего-либо, близкого к контейнерам multi-D.

Здесь - мой старый вопрос, объясняющий проблему, с очень подробным ответомот NicolBolas

В любом случае, вы найдете там попытку реализации, которую я отправил на Code Review - это была третья попытка, и вы увидите, что попытка имитировать стандартные контейнеры через несколькоD-массивы вскоре приводят к некоторой сложности ...

0 голосов
/ 01 декабря 2019

Вы можете использовать шаблон. Параметры известны во время компиляции, поэтому вы можете использовать их для определения размеров вашего массива:

#include <iostream>
#include <cstdlib>

template < int nRows, int nCols>
class MyFunArray
{
  public:
  int m_nRows = nRows;
  int m_nCols = nCols;
  char map[nRows][nCols];

  bool SetValue(char val, int row, int col)
  { if (row >= 0 && row < m_nRows && col >= 0  && col < m_nCols)
    {   map[row][col] = val;
        return true;
    }
    return false;
  }

  char GetValue(int row, int col)
  { if (row >= 0 && row < m_nRows && col >= 0  && col < m_nCols)
      return map[row][col];
    else
      return '\0';
  }
};


int main()
{
    MyFunArray<3,4> myArr;
    myArr.SetValue('b', 1,2);
    std::cout << myArr.GetValue(1,2) << std::endl;
}

Я добавил функции Set / Get, просто чтобы кодировать ограниченные пределы. Если вы чувствуете себя смелым (и безответственным), вы можете получить прямой доступ к map.

0 голосов
/ 01 декабря 2019

Это невозможно. Массивы должны иметь постоянные размеры во время компиляции в C ++. См. этот вопрос для объяснения причин. Вы можете динамически распределить его, но вам придется управлять памятью, которая может усложниться. std::vector, вероятно, является наилучшим вариантом, и вы можете использовать одномерный вектор, отображая двумерные индексы в одномерные индексы, что более эффективно, чем вектор векторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...