在不同的文件(C++)中定义指针数组长度

Define pointer array length in different file(C++)

本文关键字:定义 指针 数组 C++ 文件      更新时间:2023-10-16

我目前正在制作一款基于控制台的小型游戏。我为敌人,主角和游戏制作了一个类,其中包括绘图,逻辑等,我正在为他们使用单独的文件。

我想做的是在游戏类标题中声明一个 Enemy 类的指针数组,然后根据你设法通过的楼层数定义生成多少敌人。 我希望我能像这样或类似地做:

游戏.h

CEnemy *en;

游戏.cpp

*en = new CEnemy[currentFloor]

但这当然不起作用..因为我没有在.h文件中将其声明为数组。

CEnemy *en[];

也行不通。 你能给我一些技巧吗?

编辑:按照@WhozCraig的建议,我将用我的问题制作一个示例项目

主.cpp

#include "stdafx.h"
#include "Game.h"
#include <iostream>
using namespace std;
CGame game();
int main()
{
game.setup();
while (game.GameRunning())
{
game.render();
game.input();
game.logic();
}
game.clear();
return 0;
}

游戏.h

#include "Player.h"
#include "Enemy.h"
class CGame
{
public:
CGame();
~CGame();
void setup();
void render();
void input();
void logic();
bool GameRunning() { return isRunning; };
void clear();
private:
bool isRunning;
int currentFloor = 5;
int stairX, stairY;
bool enDraw(int, int);
void nextLevel();
CPlayer mc;
CEnemy *en; //part of the problem
};

游戏.cpp

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <ctime>
#include "Game.h"
using namespace std;
//i left constructor etc out
void CGame::setup() {
*en = new CEnemy[currentFloor]; //E0349
mc.setX(width / 2);
mc.setY(height / 2);
stairX = rand() % width;
stairY = rand() % height;
for (int i = 0; i < currentFloor; i++)
{
en[i]->setX(stairX + rand() % 5); //E0044
en[i]->setY(stairY + rand() % 5);
if (en[i]->getX() < 0) en[i]->setX(0); if (en[i]->getX() > width - 1) en[i]->setX(width - 1);
if (en[i]->getY() < 0) en[i]->setY(0); if (en[i]->getY() > height - 1) en[i]->setY(height - 1);
}
}
.....

错误消息:
E0349 没有运算符匹配这些操作数
E0044 表达式必须具有指针类型
我希望我没有忘记任何东西

我想做的是在游戏类标题中声明一个类敌人的指针数组,然后根据你设法通过的楼层数定义生成多少敌人。

如果要定义一个指针数组,并且知道编译时的楼层总数,则需要声明

CEnemy * en[NUM_FLOORS];

这是从右到左的:指向CEnemy的指针数组(大小为NUM_FLOORS)。然后,您可以在特定楼层创建许多敌人n

en[n] = new CEnemy[NUM_ENEMIES_FOR_FLOOR_N];

如果在编译时不知道NUM_FLOORS,则可以声明

CEnemy ** en;

并在运行时创建楼层

en = new CEnemy*[NUM_FLOORS];

但是,我强烈建议尽可能避免自己管理内存,因为它很容易泄漏内存并且更难推理。您可以考虑改用std::vector,它可以根据需要动态增长。

在您的示例中,它可能看起来像

vector<vector<CEnemy>> floors;

然后,您可以轻松添加楼层或修改楼层

// Add a new floor with n enemies
floors.push_back(vector<CEnemy>(n));
// Add a new enemy to floor f (assuming the floor already exists)
floors[f].emplace_back();
*en = new CEnemy[currentFloor]

不起作用,因为星号取消引用指针,也就是它为您提供en指向的对象。new运算符返回已分配内存的地址,因此尝试将其分配给 CEnemy 不起作用。

您所要做的就是像这样取出星号:en = new CEnemy[currentFloor].确保删除带有delete[]运算符的指针。

顺便说一下,如果你只需要一个大小可变的数组,请使用 std::vector。