【问题标题】:Changing the object a pointer points to in c++在c ++中更改指针指向的对象
【发布时间】:2016-05-22 22:00:41
【问题描述】:

我正在创建一个游戏,我有一个指向英雄对象的指针数组。一次只能激活一个英雄,所以我有一个单独的指向激活英雄的指针。 如果重要的话,我使用的是 Qt,并且 Hero 类继承自 QgraphicsItem。

能够在英雄之间切换很重要,因此我编写了以下代码:

void Game::toggleHero()
{

    if(activeHero==hero[0])
    {
        activeHero  =hero[1];
        hero[1]->setFocus();
    }
    else if(activeHero == hero[1])
    {
        activeHero = hero[0];
        hero[0]->setFocus();
    }
}

问题是,那个方法做了我期望它做的事,但只是第一次被调用。 activeHero newer 变回原来的对象。

英雄对象数组是游戏类的成员,并在游戏对象的构造函数中初始化。唯一一次引用 activeHero 是在添加挂钩项或调用 setView() 方法时。

class Game : public QGraphicsView
{
public:
Game();
Terrain *ground[63];
Wall *wall[63];
Ladder *ladder[63];
Bushes * bush;
QGraphicsScene * scene;
Hero *hero[1];
Hero *activeHero;
void buildLevel(int level);
void setView();
void toggleHero();

};

来自游戏对象的构造函数: //添加英雄 英雄[0] = 新英雄(); 英雄[0]->setFlag(QGraphicsItem::ItemIsFocusable); 英雄[0]->setFocus(); 场景->addItem(英雄[0]); 英雄[0]->setPos(5,1200); // activeHero = hero[0]; 英雄[1] = 新英雄(); 英雄[1]->setFlag(QGraphicsItem::ItemIsFocusable); 英雄[1]->setFocus(); 场景->addItem(英雄[1]); 英雄[1]->setPos(10,1300); activeHero = hero[0];

setView() 方法检查活动英雄是否在视图中,如果不在,它会移动视图以使活动英雄位于相对于视图的正确位置。

void Game::setView()
{

if((!(activeHero->pos().y()+activeHero-           >rect().height()/2==sceneRect().y()+sceneRect().height()/2-400)&&((activeHero-        >y()+activeHero->rect().height()/2-400>0))&&(activeHero->y()+activeHero->rect().height()-400<1600))){

    setSceneRect(sceneRect().x(),activeHero->pos().y()+activeHero->rect().height()/2-400,800,600);

}
if((!(activeHero->pos().x()+activeHero->rect().width()/2==sceneRect().x()+sceneRect().width()/2))&&((activeHero->x()+activeHero->rect().width()-450>0)&&(activeHero->x()+activeHero->rect().width()+350<3200))){
    setSceneRect(activeHero->pos().x()+activeHero->rect().width()/2-400,sceneRect().y(),800,600);
}

最后,Hook 对象使用 activeHero 将自己定位在场景中。

Hook::Hook(int direction)
{
hookdirection = direction;
switch(hookdirection)
{
case -1:
{
setRect(0,0,16,16);
setPos(game->activeHero->pos());
break;
}
case 1:
{
    setRect(0,0,16,16);
    setPos(game->activeHero->pos().x()+game->activeHero->rect().width()-    rect().width(),game->activeHero->pos().y());
    break;
}
default:
{
    setRect(0,0,16,16);
    break;
}

}
timer = new QTimer;
connect(timer,SIGNAL(timeout()),this,SLOT(move()));
timer->start(10);

lineItem = new QGraphicsLineItem();
lineItem->setParentItem(this);
game->activeHero->scene()->addItem(lineItem);

}

toggleHero 方法的目的是在 hero[0] 和 hero[1] 之间切换,使它们每个都是上面方法中的 activeHero。

【问题讨论】:

  • 这里没有足够的信息来解决问题。请告诉我们activeHerohero 数组是在哪里声明(和初始化)的,并记下这些变量可能发生的任何其他重大变化。

标签: c++ pointers


【解决方案1】:

如果 hero 是一个指针,您需要决定是比较英雄(例如,通过名称与重载运算符)还是地址。所以应该是:

if(*activeHero==hero[0])
    {
        *activeHero  =hero[1];
        hero[1]->setFocus();
    }
    else if(*activeHero == hero[1])
    {
        *activeHero = hero[0];
        hero[0]->setFocus();
    }

或者应该是

if(activeHero==&hero[0])//address of hero[0]
{
    activeHero  =&hero[1];
    hero[1]->setFocus();
}
else if(activeHero == &hero[1])
{
    activeHero = &hero[0];
    hero[0]->setFocus();
}

【讨论】:

  • 不一定。从hero[1]-&gt;setFocus() 可以看出hero 是一个指针数组。而来自activeHero =hero[1];activeHero 是一个指针。使用实体语义,英雄由 unique 对象表示,然后可以通过其地址来识别。 hero[0] 就是这样一个地址。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多