【问题标题】:c++ How to make changes to the same object across multiple classes?c++ 如何跨多个类对同一个对象进行更改?
【发布时间】:2016-07-29 18:48:00
【问题描述】:

这里是菜鸟。我正在尝试跨多个类更改Player 对象mainCharacter。我目前声明了一个Player 对象,如下所示。 Player可以传送到不同的世界和怪物战斗。

所有这些代码都有效。一旦一个世界的敌人被击败,他们就会保持失败。我的问题是当他传送到另一个世界时,Player 的统计数据都被重置为默认值;即使在前一个世界受到敌人的伤害,他的生命值也会再次满。

如何跨多个类或世界对同一个 Player 对象进行更改?我认为我的声明中有问题,但我不确定。我很感激任何意见。谢谢!

mainCharacter 对象的声明位置:

class SpaceList
{
    protected:
        class SpaceNode
        {
            friend class SpaceList;
            Player mainCharacter;
            Space* thisSpace;
            SpaceNode* next;
            SpaceNode(int m, SpaceNode* next1 = NULL)
            {
                if(m == 0)
                {
                    thisSpace = new EntranceHall(&mainCharacter);
                }
                else if(m == 1)
                {
                    thisSpace = new WaterSpace(&mainCharacter);
                }

Player.hpp的一部分:

class Player: public Interactable
{
    protected:
        Backpack myBackpack;
    public:
        Player();
        virtual interactableType getInteractableType();
        virtual int interact();
        virtual int attack();
        virtual void defend(int);

Player.cpp的一部分:

Player::Player()
{
    healthPoints = 10;
    numberOfAttackDice = 1;
    sidesOfAttackDice = 6;
    numberOfDefendDice = 1;
    sidesOfDefendDice = 6;
}

mainCharacterEntrance (Entrance.cpp) 开始:

EntranceHall::EntranceHall(Interactable* mainCharacter)
{
    interactableGrid[6][3] = mainCharacter;
    interactableGrid[0][3] = new Portal(0);//entrance portal
    interactableGrid[3][3] = new InterestPoint(0);//stone mural
}

mainCharacter 稍后可能会传送到水世界,重置默认值 (Waterspace.cpp):

WaterSpace::WaterSpace(Interactable* mainCharacter)
{
    interactableGrid[3][0] = mainCharacter;
    interactableGrid[3][3] = new Boss(this->getSpaceType());

【问题讨论】:

  • mainCharacter 是在哪里创建的?听起来它每次都会创建新的,这会给你一个新的“播放器”实例。相反,您似乎想创建一个播放器并继续使用它的实例。
  • @SteveFrancisco 这正是我想做的。我在 spacelist.hpp 中创建了它,我以为我将相同的 Player 发送到 EntranceHall 和 WaterSpace 等,认为如果对 EntranceHall 中的 Player 进行更改,它将反映在 WaterSpace 中,但事实并非如此。
  • 下面的答案有正确的想法。每次创建空间节点时都会默认实例化空间节点中的 mainCharacter。您可能希望创建一次 Player 对象,然后通过 SpaceNode 方法或作为构造函数的参数将其传递给各个空间。

标签: c++ class pointers object


【解决方案1】:

删除SpaceNodePlayer 之间的has-a 关系- 在外部某处创建Player 的实例并使用指针来引用它,就像你习惯的那样。或者直接设为static,这样只有一个实例不会被重构(或者更确切地说是为每个SpaceNode 单独构建)。


注意事项:

  • 不要自己实现链表,这种数据结构甚至不适合这里。试试std::vector

  • 更好地切换到智能指针。你可能在不知不觉中泄漏了内存。

【讨论】:

  • 感谢@LogicStuff 的建议!谢谢!
  • @anna 不客气。通过接受答案而不是编辑标题来标记问题已解决。
猜你喜欢
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多