在不同的文件(C++)中定义指针数组长度
Define pointer array length in different file(C++)
我目前正在制作一款基于控制台的小型游戏。我为敌人,主角和游戏制作了一个类,其中包括绘图,逻辑等,我正在为他们使用单独的文件。
我想做的是在游戏类标题中声明一个 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。
- 用户定义函数中的指针和输入
- 使用"Task"函数指针队列定义作业管理器
- 通过函数指针定义类范围之外的方法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何重新定义 C++ 指针函数?
- 返回对未定义指针的引用
- 为什么此自定义指针类会崩溃?
- 如何定义指针铸件操作员
- 定义指针随机崩溃该程序
- 在不同的文件(C++)中定义指针数组长度
- 如何定义指针和动态内存分配的模板
- 具有自定义指针类型的unique_ptr:*get() 和运算符*() 给出不同的输出
- 定义指针时不显示输出;
- 自定义指针类型和容器/分配器类型定义
- 并排定义指针和类型问题
- 具有自定义指针类型的内存分配器
- 正在对unordered_set的自定义指针类型进行哈希处理
- 查找全局定义指针指向的地址,该地址使用了堆分配
- 如何有效地计算已定义指针的数量
- 用户定义指针队列中的分段错误