我正在尝试全局声明一个二维指针数组。
在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中明确声明并包含在内。
答案 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()上面声明它并在函数内填充它。