我目前正在制作一款基于游戏机的小游戏。我为敌人,主角和游戏制作了一个类,包括绘图,逻辑等,我正在为它们使用单独的文件。
我想要做的是在Game类标题中声明一个Enemy类的指针数组,然后根据你设法通过多少个楼层来定义产生的敌人数量。 我希望我能像这样或类似的那样做:
game.h
CEnemy *en;
game.cpp
*en = new CEnemy[currentFloor]
但这当然不起作用..因为我没有在.h文件中将其声明为数组。
CEnemy *en[];
也不起作用。 你能给我一些技巧吗?
编辑:正如@WhozCraig建议我将用我的问题做一个示例项目
的main.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;
}
game.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
};
game.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表达式必须具有指针类型
我希望我没有忘记任何事情
答案 0 :(得分:1)
我想要做的是在Game类标题中声明一个Enemy类的指针数组,然后根据你设法传递的楼层数定义产生多少个enemys。
如果你想定义一个指针数组,并且你知道编译时的总楼层数,你需要声明
CEnemy * en[NUM_FLOORS];
这从右到左阅读:指向NUM_FLOORS
的指针数组(大小为CEnemy
)。然后,您可以使用
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();
答案 1 :(得分:0)
*en = new CEnemy[currentFloor]
不起作用,因为星号取消引用指针,也就是它为您提供en
指向的对象。 new
运算符返回已分配内存的地址,因此尝试将其分配给CEnemy不起作用。
您需要做的就是取出这样的星号:en = new CEnemy[currentFloor]
。确保使用delete[]
运算符删除指针。
顺便说一句,如果您只需要一个大小未知的数组,请使用std::vector,我不确定,但CEnemy en[currentFloor]
也可能适用于较新版本的C ++。