Я пытаюсь глобально объявить двумерный массив указателей.
В global.h у меня есть:
#ifndef GLOBAL_H
#define GLOBAL_H
#include<vector>
#include "PlayerClass.h"
#include "MonsterClass.h"
#include "RoomClass.h"
void roomDeclare (int xSize, int ySize)
{
RoomClass **room = new RoomClass*[xSize];
for (int i = 0; i < xSize; i++) room[i] = new RoomClass[ySize];
}
...
#endif
а затем в моем main.cpp у меня есть:
#include "global.h"
...
/*get maxX and maxY from player*/
roomDeclare(maxX, maxY);
MapGen(maxX, maxY, room, ...);
Это говорит мне, что "ошибка: номер не был объявлен в этой области", он был четко объявлен в global.h, и это включено.
Переменные, определенные внутри функции, являются локальными для этой функции, и они теряют область сразу после возвращения функции. Вам необходимо объявить переменную комнаты на глобальном уровне - не внутри какой-либо функции.
помещение также должно быть помечено как extern
в файле заголовка и объявлено в файле кода (globals.cpp или main.cpp), иначе каждый файл кода, который включает в себя, попытается создать его собственную комнату и вызовет ошибки связи или неправильное поведение. Использование extern
гарантирует, что все файлы кода относятся к одной room
.
Вам также может потребоваться сохранить xSize как глобальную переменную или передать ее функции, которая освободит память, выделенную в roomDeclare, так как вам нужно знать размерность массива для правильной очистки.
#ifndef GLOBAL_H
#define GLOBAL_H
#include <vector>
#include "PlayerClass.h"
#include "MonsterClass.h"
#include "RoomClass.h"
extern RoomClass** room;
void roomDeclare(int xSize, int ySize);
void roomFree();
#endif //GLOBAL_H
#include "global.h"
RoomClass** room;
void roomDeclare(int xSize, int ySize) {
room = new RoomClass*[xSize];
for (int i = 0; i < xSize; i++) {
room[i] = new RoomClass[ySize];
}
}
void roomFree(int xSize) {
for (int i=0; i < xSize; i++) {
delete [] room[i];
}
delete [] room;
}
В C++ вы обычно не делаете этого, так как легко забыть очистить память. Вы обычно инкапсулируете это поведение в класс, где указатель комнаты является частным членом класса, распределение происходит в конструкторе класса, освобождение происходит в деструкторе. Вы могли бы разоблачить комнаты с помощью методов класса таким образом, чтобы они не изменяли сам объект комнаты, чтобы предотвратить утечку памяти, а также сохранить код аккуратным и поддерживаемым.
Объем комнаты ограничен функциональной комнатойDeclare(). Он не отображается в глобальном пространстве имен, где вы пытаетесь его использовать. Вы можете объявить его выше roomDeclare() и заполнить его внутри функции.