2016-02-13 86 views
0

在我的程序中,无论何时单击鼠标,我都会将类Laser的实例添加到向量中。后来,当更新激光运动时,我检查它是否已经经过了一定的距离,如果有,我想将它从矢量中移除。因此,我首先将激光位置与this.getPosition()的位置进行比较,然后它无法工作。所以相反,我试图使用运算符重载,所以我可以==向量中的激光和“这个”激光。我只想知道矢量中的激光是否与'this'激光相同。但它从来没有工作。这是我的代码。比较C++中对象实例的内存地址

class Laser 
{ 
public: 
    sf::Texture texture; 
    sf::Sprite sprite; 
    int speed; 
    sf::Vector2i startPoint; 
    sf::SoundBuffer buffer; 
    sf::Sound sound; 
    void move(std::vector <Laser> shots); 
    bool operator == (const Laser& rh)const; 
    Laser(float rot, int spd, sf::Vector2i pos); 
    Laser() {}; 
    ~Laser(); 
}; 

和运营商超载的代码,我真的试试看看它是否是同一个激光器。

 int index = -1; 
     for (int i = 0; i < shots.size(); i++) { 
      if (*this == shots[i]) { 
       index = i; 
       break; 
      } 
     } 
     if (index >= 0) { 
      shots.erase(shots.begin() + index); 
     } 


    } 

} 

bool Laser::operator==(const Laser & rh) const 
{ 
    return (*this == rh); 
} 

所以真的,所有我想要做的是比较它们的内存地址,看看他们是激光或不相同的情况下,这样我就可以从向量中删除。感谢您提前提供任何帮助,如果我一直特别无知或粗鲁或类似的话,我会很抱歉。

+0

'(* this == rh)'不会比较地址。事实上,这将会递归调用'Laser :: operator =='并导致堆栈溢出错误。 –

回答

1

*thisLaserrh是激光,所以它叫Laser::operator==
而在*this里面的是Laser,rh是激光,所以它叫Laser::operator==
而在*this里面的是Laser,rh是激光,所以它叫Laser::operator==
而在*this里面的是Laser,rh是激光,所以它叫Laser::operator==

你看到了这个问题?如果你想要做的只是比较内存地址,那就改为做。 this是一个内存地址,&rh是一个内存地址,所以:

return this==&rh 

话虽这么说,这是一个可怕的想法。身份不应该成为C++平等的基础。如果你解释真正的问题,我们可以想出一个更好的解决方案。

+0

好吧,我之前尝试过,因为我在另一个问题中发现它,但它永远不会返回true,即使它应该是因为所有激光器都在向量中检查。那么int index = -1是否有问题? (int i = 0; i = 0){shot.erase(shots.begin()+ index); } –

+0

很可能是因为您与之比较的对象不在矢量中。此代码是准确的,它是检查不正确的向量的代码。 –

+0

比较不会出现的唯一方法就是如果我取消引用,或者使[i]作为参考,但这也不起作用。 –