我的代码出了问题,这只是涉及OpenGL的一大段代码的摘录,但仍然证明了这个问题。它可以在没有碰撞检测调用的情况下工作(col.detect()) - 如果你认为非宽松的墙可以工作 - 但是当我取消注释它时,程序会中断。代码本身似乎没有什么问题,它编译得很好,但不能按照我期望的方式工作。
感谢所有帮助 最诚挚的问候
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 :(得分:1)
下面将使您的程序在下次使用point
时调用未定义的行为:
collision::collision(Ball ball)
{
point = &ball;
}
point
定义为:
Ball *point;
问题是您使用自动存储持续时间存储对象的地址。该函数完成后ball
将不复存在,因此point
指向无效对象。
你可能想参考球;或者更好地在您的计划中使用std::unique_ptr
或std::shared_ptr
的服务。
答案 1 :(得分:0)
更改以下代码
collision::collision(Ball ball)
到
collision::collision(Ball& ball)
它应该可以解决你的问题。问题是Ball是一个局部变量,其地址在构造函数退出后不再有效。解决方案:通过引用发送对象,存储在指针中的地址将是main()函数中创建的对象。