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

时间:2018-01-27 23:51:20

标签: c++ arrays class pointers

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

我想要做的是在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表达式必须具有指针类型
我希望我没有忘记任何事情

2 个答案:

答案 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 ++。