我的object :: collides(object * o)函数始终返回true,但不执行任何操作

时间:2019-01-07 18:21:58

标签: c++ oop pointers boolean dynamic-cast

我有一个返回布尔值的函数。此函数在编译时似乎不包含任何内容,并且将始终返回true,同时还会跳过我放入的所有对cout或cin的调用。看看它实际上在做什么。发生了什么事以及如何解决此问题。

在进行故障排除的过程中,

  • 使用的GDB在object :: collides处有一个断点,这导致该函数被调用但不向控制台输出任何内容
  • 将我的对象编号为对象,并比较程序认为正在碰撞的对象与正在碰撞的对象。如果通过了接近度测试,程序会认为这些对象正在碰撞,从而证明它始终返回true。
  • 尝试了其他各种方法来试图弄清正在发生的事情,但是所有人都没有答案

在object.cpp中:

bool object::collides(object * other)
{
   std::vector<point> a_pnt = getBounds();
   std::vector<point> b_pnt = other->getBounds();
   for (int i = 0; i < a_pnt.size(); i++)
   {
       for (int j = 0; j < b_pnt.size(); j++)
       {
          point v1 = a_pnt[i];
          point v2 = a_pnt[(i+1)%a_pnt.size()];
          point v3 = b_pnt[j];
          //edit: fixed typo
          point v4 = b_pnt[(j+1)%b_pnt.size()];

          double num_1 = ((v3.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v3.y - v1.y));
          double num_2 = ((v2.x - v1.x) * (v3.y - v1.y)) - ((v3.x - v1.x) * (v2.y - v1.y));
          double den =((v2.x - v1.x) * -(v4.y - v3.y)) - (-(v4.x - v3.x) * (v2.y - v1.y));
          double frac_1 = num_1 / den;
          double frac_2 = num_2 / den;

          //debug code start
          std::cout << num_1 << "/" << den << "=" << frac_1 << std::endl;
          std::cout << num_2 << "/" << den << "=" << frac_2 << std::endl;
          std::cout << (frac_1 > 0.0) << " " << (frac_1 < 1.0) << " " << (frac_2 > 0.0) << " " << (frac_2 < 1.0) << std::endl;
          std::cout << std::endl;

          std::string hahah;
          std::cin >> hahah;
          //end debug code

          //edit: fixed conditional
          if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0));
             return true;
       }
   }
   //edit: fixed conditional
   return false;
}

在mode.cpp中,在函数mode::step()中:

for (int i = 0; i<onScreen.size(); i++)
{

    object * o1 = onScreen[i];
    for(int j = i+1; j<onScreen.size(); j++)
    {
        object * o2 = onScreen[j];
        if(o1->getVectorLength(o2)<50){

            std::cout << "Checking collisions for objects " << i << " and " << j << std::endl;

            if(o1->collides(o2))
            {
                 std::cout << "somthing collided\n";

            }
        }
    }
}

输出:

Checking for Collisions

Checking collisions for objects 0 and 11
somthing collided
Checking collisions for objects 1 and 8
somthing collided
Checking collisions for objects 1 and 18
somthing collided
Checking collisions for objects 1 and 26
somthing collided

预期结果是“ collides”函数输出到屏幕或请求该字符串的输入的结果,这将表明它实际上正在正确地遍历该部分代码。但是它不会这样做。不管实际的相交部分是true还是false,“ collides”函数都会返回true,同时跳过所有调试代码,如输出所示。

编辑:

  • 修正了收益的冲突
  • 修正了打字错误
  • 仍然不起作用。
  • 使用子弹/子弹组合而不是子弹/小行星或小行星/小行星进行思维循环

  • 检查getBounds是否让我挠头...

    std :: vector小行星::: getBounds() {     //我的问题在这里,请仔细检查您的功能:P     //未返回包含任何内容的向量。     std :: vector t;     //现在是     std :: vector t = lyrs [0] .pnts;

    for (int i = 0; i < t.size(); i++)
    {
        double x = t[i].x+location.x;
        double y = t[i].y+location.y;
        t[i] = point{x, y, t[i].z};
    }
    return t;
    

    }

  • 我认为实施正确

2 个答案:

答案 0 :(得分:0)

此行出现问题:

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0)); //This semicolon here
    return true;

在if语句的末尾添加分号基本上会结束if语句。您写的等同于

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
{
}
return true;

修复非常简单。只需删除分号即可:

if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
    return true;

答案 1 :(得分:0)

所以我的问题很简单,而且有点“过时”。首先,无论我的数学是否正确完成,我必须解决的未实现问题都是返回true,但是由于未触及这一部分,因此这并不是真正的问题。感谢那些仍然注意到它的人。

第一个问题(如果返回true,则为否):

在collides.cpp

for (int i = 0; i < a_pnt.size(); i++)
{
   for (int j = 0; j < b_pnt.size(); j++)
   {
       ...
       return true;
    }
 }

固定为:

for (int i = 0; i < a_pnt.size(); i++)
{
   for (int j = 0; j < b_pnt.size(); j++)
   {
       ...
      if((frac_1>0.0)&&(frac_1<1.0)&&(frac_2>0.0)&&(frac_2<1.0))
         return true;
    }
 }

第二个也是主要的问题,在评论者的建议下,他的名字出现在上面的问题中,我仔细检查了getter的边界框。低低,这是我的问题。一开始我不屑一顾他的建议,因为我以为我已经完全实现了该方法,但这是我的问题,学习宝贵的经验教训总是一件好事。

第二个问题(GetBounds的实现不完整,导致返回了空向量。)

在asteroids.cpp中:

std::vector asteroid::getBounds() 
{ 
    //my issue was here, check your functions a bit more closely :P 
    //wasn't returning a vector with anything in it. 
    std::vector<point> t; 
    //now it's 
    std::vector<point> t = lyrs[0].pnts;

    for (int i = 0; i < t.size(); i++)
    {
       double x = t[i].x+location.x;
       double y = t[i].y+location.y;
       t[i] = point{x, y, t[i].z};
    }
return t;
}

要学习的经验:即使您认为自己的所有功能都可以正常工作,但有时还是不这样做,您应该检查并仔细检查所调用的每个函数,以防万一您认为正在运行的这些功能之一实际上并未正常工作正常工作。