2017-04-15 81 views
-2

得到一个问题,我的代码,这仅仅是从一块较大的,涉及的OpenGL代码的摘录,但仍说明了问题。它在没有碰撞检测调用(col.detect())的情况下工作 - 如果您认为不灵活的墙可以工作 - 但是当我取消注释时,程序会中断。代码本身没有什么问题,它编译得很好,但不能按我期望的方式工作。乒乓球比赛窃听了 - mayby指针

感谢所有帮助 问候

collision.h

#pragma once 
#include "Ball.h" 

class collision 
{ 
public: 
    collision(); 
    collision(Ball ball); 
    void detect(); 
    ~collision(); 
private: 
    Ball *point; 
}; 

Ball.h

#pragma once 
class Ball 
{ 
public: 
    Ball(); 
    double getpx(); 
    double getpy(); 
    double getvx(); 
    double getvy(); 

    void setpx(const double px); 
    void setpy(const double py); 
    void setvx(const double vx); 
    void setvy(const double vy); 

    void update(); 
    ~Ball(); 
private: 
    double position[2] = { 0, 0 }; 
    double velocity[2] = { 0.1, 0 }; 
}; 

collision.cpp

#include "collision.h" 

collision::collision() 
{ 
} 

collision::collision(Ball ball) 
{ 
    point = &ball; 
} 

void collision::detect() 
{ 
    if (point->getpx() > 1 || point->getpx() < -1) 
     point->setvx(-point->getvx()); 
    else if (point->getpy() > 1 || point->getpy() < -1) 
     point->setvy(-point->getvy()); 
} 

collision::~collision() 
{ 
} 

Ball.cpp

#include "Ball.h" 

Ball::Ball() 
{ 
} 

double Ball::getpx() 
{ 
    return position[0]; 
} 

double Ball::getpy() 
{ 
    return position[1]; 
} 

double Ball::getvx() 
{ 
    return velocity[0]; 
} 

double Ball::getvy() 
{ 
    return velocity[1]; 
} 

void Ball::setpx(const double px) 
{ 
    position[0] = px; 
} 

void Ball::setpy(const double py) 
{ 
    position[1] = py; 
} 

void Ball::setvx(const double vx) 
{ 
    velocity[0] = vx; 
} 

void Ball::setvy(const double vy) 
{ 
    velocity[1] = vy; 
} 

void Ball::update() 
{ 
    position[0] += velocity[0]; 
    position[1] += velocity[1]; 
} 

Ball::~Ball() 
{ 
} 

的main.cpp

#include <iostream> 
#include "Ball.h" 
#include "collision.h" 

using namespace std; 

int main() 
{ 
    Ball tennis; 
    collision col(tennis); 

    while (true) 
    { 

     tennis.update(); 
     col.detect(); 

     cout << tennis.getpx() << endl; 
     cin.get(); 
    } 

    return 0; 
} 
+0

编辑:改变if语句否则,如果在碰撞检测::()解决这里当我使用col.detect(该程序不运行)的一部分;但是这阻止我一次测试x和y碰撞条件。 –

+1

了解指针,引用和值之间的区别以及如何使用调试器。你可能需要'collision :: collision(Ball&ball)',现在你正在制作一个Ball的副本,并获取该函数返回时被破坏的那个变量的地址。 – stijn

回答

1

下面会导致你的程序时,下次使用point调用未定义行为:

collision::collision(Ball ball) 
{ 
    point = &ball; 
} 

point被定义为:

Ball *point; 

的问题是,要存储的对象的地址与自动存储持续时间ball将在该功能完成后不再存在,因此将point指向无效对象。

你可能想参照花球;或者更好的是在你的程序中使用std::unique_ptrstd::shared_ptr的服务。

+0

糟糕的错误,感谢您的帮助...有关指针的其他信息也非常有用。谢谢 –

0

更改下面的代码

collision::collision(Ball ball) 

collision::collision(Ball& ball) 

应该解决您的问题。问题在于Ball是一个局部变量,在构造函数退出后,它的地址不再有效。解决方案:通过引用发送对象,存储在指针中的地址将是main()函数中创建的对象的地址。