在构造函数

时间:2017-12-30 13:19:14

标签: c++

我看到一些帖子有同样的问题,但我没有理解我如何使临时对象保持不变

Map.H

#ifndef _Map_
#define _Map_
class Map
{
private:

    int Board[7][7];

public:

    Map();
    Map(int mapNum);
    ~Map();
    void print() const;
};

#endif

Map.Cpp基本上只创建一个7 * 7数组,在所有位置都是0或1

Robots.H

#ifndef _Robot_
#define _Robot_
#include "Map.h"
class Robot
{
private:
    int _RobotID;
    int _mapNum;
    int _X;
    int _Y;


public:
    Robot();
    ~Robot();
    Robot (int mapNum, int Line, int Column);
    void setRobotID(int newid);
    void print() const;
};

#endif

取值     Robot.cpp

#include "Robot.h"
#include "Map.h"
#include <iostream>
#include "Game.h"
using namespace std;


    Robot::Robot()
    {
    }

    Robot::Robot(int mapNum, int line, int column) {
        _mapNum = mapNum;
        _X = line;
        _Y = column;
        _RobotID=0;

    }

现在在我的主要作品中创建一张地图,然后打印它。 机器人也一样。 我想要做的是将机器人和地图连接到我的游戏中#game; game.cpp \ game.h&#34;这样我添加的每个机器人都会检查地图(双数组中有0&#39; s或1&#39; s)如果它有1则不会将它添加到地图中。如果它有0则会。 (addRobot函数假设这样做)

Game.H

#ifndef _Game_
#define _Game_
#include <vector>
#include <iostream>
#include "Map.h"
#include "Robot.h"
class Game

{
private:
    static int _RobotsNum;
    Map map1;
    Map map2;


public:
    void AddRobot(int mapnum, int x, int y);
    Map getMap(int mapnum);
    Game();
    ~Game();

};
#endif

游戏cpp

#include "Game.h"
#include <algorithm>
#include <vector>

using namespace std;

int Game::_RobotsNum = 0;
vector <Robot> RobotVec;
Game::Game()
    : map1(1),
    map2(2)
{
}
Game::~Game()
{
}
void Game::AddRobot(int mapnum, int x, int y) {

我的主要

    int main() {
    Game game;
//  Game* pgame = new Game();
    game.AddRobot(1, 3, 4);
    game.AddRobot(1, 4, 4);
    game.AddRobot(1, 5, 4);
希望你们能帮助我。感谢

2 个答案:

答案 0 :(得分:2)

此构造函数有三个局部变量,其名称与其他变量相同:

Game::Game()
{
    vector <Robot> RobotVec; // Not your global variable
    Map map1(1);             // Not your member variable
    Map map2(2);             // Not your member variable either
}

要初始化成员,请使用初始化列表

Game::Game()
  : map1(1),
    map2(2)
{
}

addRobot中,这会创建一个机器人并在其上指向X

Robot* X = new Robot;

这也会创建一个机器人,所以现在你有两个:

Robot newRobot(mapnum, x, y);

此内存泄漏X远离其原始机器人,而是将其指向newRobot,之后会立即销毁:

X = &newRobot;

请注意addRobot在任何时候都不会将机器人添加到任何东西 - 它会创建两个并忽略它们。

你应该让矢量成为一个成员(避免全局变量,除非重复其他人的错误是你的特别热情):

class Game
{
private:
    int robotsNum;
    vector<Robot> robotVec;
    Map map1;
    Map map2;
// ...
};

Game::Game()
  : robotsNum(0),
    map1(1),
    map2(2)
{
}

将新机器人添加到矢量中:

void Game::AddRobot(int mapnum, int x, int y) {
    // ...

    Robot newRobot(mapnum, x, y);
    robotsNum++;
    newRobot.setRobotID(robotsNum);
    robotVec.push_back(newRobot);
}

答案 1 :(得分:0)

Robot newRobot(mapnum, x, y);

这将创建一个名为Robot的{​​{1}}类型的对象。在它创建的块的末尾,它将被销毁。