Глобальные переменные утверждают, что не объявлены

0

Я пытаюсь глобально объявить двумерный массив указателей.

В 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, и это включено.

  • 2
    Вы, конечно, не знаете о понятии «сфера». Вы должны выучить это, так как это фундаментальный элемент языка.
Теги:

2 ответа

2

Переменные, определенные внутри функции, являются локальными для этой функции, и они теряют область сразу после возвращения функции. Вам необходимо объявить переменную комнаты на глобальном уровне - не внутри какой-либо функции.

помещение также должно быть помечено как 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++ вы обычно не делаете этого, так как легко забыть очистить память. Вы обычно инкапсулируете это поведение в класс, где указатель комнаты является частным членом класса, распределение происходит в конструкторе класса, освобождение происходит в деструкторе. Вы могли бы разоблачить комнаты с помощью методов класса таким образом, чтобы они не изменяли сам объект комнаты, чтобы предотвратить утечку памяти, а также сохранить код аккуратным и поддерживаемым.

  • 0
    Я буду использовать extern в объявлении, но как мне объявить это глобально, а не внутри области действия функции?
  • 0
    Я сделал то, что во втором фрагменте, но он заявляет «ошибка: RoomClass не называет тип» Я включил «RoomClass.h» в global.h. Кроме того, во втором фрагменте, почему у вас есть #include «global.h», разве это не должно быть в global.h?
Показать ещё 1 комментарий
1

Объем комнаты ограничен функциональной комнатойDeclare(). Он не отображается в глобальном пространстве имен, где вы пытаетесь его использовать. Вы можете объявить его выше roomDeclare() и заполнить его внутри функции.

  • 0
    Я совсем забыл об этом, парень, я устал.

Ещё вопросы

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