gpt4 book ai didi

c++ - 声明未声明的全局变量

转载 作者:行者123 更新时间:2023-11-28 00:36:18 25 4
gpt4 key购买 nike

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

在 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 中明确声明并包含在内。

最佳答案

函数内定义的变量是该函数的局部变量,一旦函数返回,它们就会失去作用域。您需要在全局级别声明 room 变量 - 而不是在任何函数内。

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

关于c++ - 声明未声明的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20809435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com