Как ссылаться на объекты в двумерном массиве? - PullRequest
3 голосов
/ 11 ноября 2011

Я прочитал, что вы можете объявить массив объектов этой строкой

Enemy * d = new Enemy[2];

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

Enemy *enemies[6][2];

но я не уверен, как ссылаться на каждый объект в этом массиве и как передать эту ссылку в функцию.

Ответы [ 4 ]

10 голосов
/ 11 ноября 2011

Вам нужно использовать указатель на указатель для создания зубчатого массива.

Enemy** d = new Enemy*[6];
for (size_t i = 0; i < 6; ++i)
    d[i] = new Enemy[2];

Если вы планируете создать массив фиксированного размера, вы можете просто создать его так же, какобычный массив.

Enemy enemies[6][2];

Затем вы просто ссылаетесь на них с помощью двух индексов.

enemies[2][1].roar();

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

Enemy* enemies = new Enemy[rows * cols];

Enemy* getEnemy(size_t row, size_t col)
{
    return enemies + (row * cols + col);
}
3 голосов
/ 11 ноября 2011

Если вы действительно хотите разместить 2D-массив в куче, вот как вы это делаете:

Enemy (*enemies)[2] = new Enemy[6][2];

Но гораздо проще без косвенного обращения:

Enemy enemies[6][2];
1 голос
/ 11 ноября 2011

Для C ++ вы должны использовать std :: vectors вместо C Arrays.

  std::vector<std::vector<Enemy> > d(6);
  for (size_t i = 0; i < 6; ++i)
       d[i].resize(2);

  //now d is ready to use
  d[1][2];
0 голосов
/ 11 ноября 2011

Вы бы сделали

Enemy (*enemies)[2] = new Enemy[6][2];

То есть указатель на массивы 2 врагов.Обратите внимание, что только первый уровень массива может быть сделан указателем и, следовательно, определен во время выполнения.

Также обратите внимание, что ваше второе определение создает массив из 6 * 2 указателей на врагов.Предполагая, что вы инициализировали их все, вы получите доступ к ним как *enemies[j][k], или если каждый указатель сам указывает на массив, как enemies[j][k][l].

Обратите внимание, что если вы хотите, чтобы оба индекса были определены вво время выполнения вы должны выделить один большой массив и использовать индексную арифметику:

Enemy * враги = новый враг [6 * 2];// доступ к элементу (j, k) врагу [6 * j + k] .fight ();

Конечно, обычно лучше использовать vector<Enemy>, если ваш класс Enemy не являетсяподходит для вектора, например, потому что он не может быть скопирован (соответственно в C ++ 11, перемещен).Кроме того, при выполнении многомерных массивов таким образом, в идеале вы должны инкапсулировать логику массива и индекса в классе.

...