在另一个类C ++的构造函数中实例化一个类的对象?

时间:2013-05-03 04:26:38

标签: c++ data-structures constructor

我正在用C ++编写基本游戏,其中包含3个类:Game类,Character类和Item类。

Game类将具有游戏的所有逻辑,因此main函数将只创建Game object,调用其逻辑函数,游戏将执行其他所有操作。可以有超过1名球员。

Character类有一个可以容纳一个或多个Items的指针向量。角色可以有一个或多个项目

Item类具有项目的所有属性和功能。

我坚持设计游戏的结构。有人建议我以这样的方式构建我的游戏:在创建Game object时,它还会创建一个Character object,然后该Character对象将创建一个指向Vector的向量,以及{{ 1}}。所以当我调用Item object时,它会调用constructor of the Game class,而Character类的构造函数会自动调用constructor of the Character class

这很有道理,但我无法弄清楚如何正确实施它。

这就是我所拥有的 这就是我到目前为止所做的:

Game.cpp

constructor of the Item class

Character.cpp

Game::Game()
{
        vector<Character*> characterVector; //to hold Characters
}

Game::startLogic()
{
    string name;
    Character character = new Character(name);
}

Item.cpp

Character::Character(string name)
{
    m_name = name;
    vector<Item*> itemVector;
}

的main.cpp

Item::Item()
{ //initialise all the attributes of an item 
}

所以我可以在游戏运行时创建一个角色(我后来仍然需要将该角色推入characterVector),但我不太确定如何为该角色创建项目。我的意思是我应该在哪里放置实例化代码?在startLogic函数中,在Game的构造函数中,还是在Character?

的构造函数中

1 个答案:

答案 0 :(得分:1)

你的矢量在错误的地方。您需要将它们作为类成员移动到类声明中,而不是作为构造函数内的局部变量。构造函数可以填充向量(但实际上,角色知道他们“出生”了什么项目,游戏开始时游戏知道哪些角色还活着吗?),但不应该< strong>声明他们。

请改为尝试:

Game.h

#include <vector>

class Character;

class Game
{
public:
    std::vector<Character*> characters;

    Game();
    ~Game();
    void startLogic();
};

Game.cpp

#include "Game.h"
#include "Character.h"
#include <memory>

Game::Game()
{
}

Game::~Game()
{
    for (std::vector<Character*>::iterator i = characters.begin();
        i != characters.end();
        ++i)
    {
        delete *i;
    }
}

Game::startLogic()
{
    ...

    // using auto_ptr as a safety catch in case of memory errors...

    std::auto_ptr<Character> c(new Character("Joe Smoe"));

    std::auto_ptr<Item> i(new Item);
    c->items.push_back(i.get());
    i.release();

    characters.push_back(c.get());
    c.release();

    ...
}

Character.h

#include <string>
#include <vector>

class Item;

class Character
{
public:
    std::string name;
    std::vector<Item*> items;

    Character(std::string aName);
    ~Character();
};

Character.cpp

#include "Character.h"
#include "Item.h"

Character::Character(std::string aName)
    : name(aName)
{
}

Character::~Character()
{
    for (std::vector<Item*>::iterator i = items.begin();
        i != items.end();
        ++i)
    {
        delete *i;
    }
}

Item.h

class Item
{
public:
    Item();
};

Item.cpp

#include "Item.h"

Item::Item()
{ //initialise all the attributes of an item 
}

的main.cpp

int main()
{
    Game g;
    g.startLogic();
    return 0;
}