我正在用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?
的构造函数中答案 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;
}