声称未声明的全局变量

时间:2013-12-27 23:52:59

标签: c++

我正在尝试全局声明一个二维指针数组。

在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 个答案:

答案 0 :(得分: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 ++中,您通常不会这样做,因为很容易忘记清理内存。您通常会将此行为封装到一个类中,其中房间指针是类的私有成员,分配发生在类构造函数中,释放发生在析构函数中。您可以通过类方法公开房间,它们不会修改房间对象本身,以防止内存泄漏,并保持代码整洁和可维护。

答案 1 :(得分:1)

房间范围仅限于funciont roomDeclare()。它在您尝试使用它的全局命名空间中不可见。您可以在roomDeclare()上面声明它并在函数内填充它。

相关问题