乒乓球游戏窃听 - 可能指向类的指针

Pong game bugging out - mayby pointer to class

本文关键字:指针 游戏 窃听 乒乓球      更新时间:2023-10-16

我的代码出现问题,这只是涉及OpenGL的较大代码段的摘录,但仍然演示了问题。它可以在没有碰撞检测调用(col.detect(((的情况下工作 - 如果您认为无弹性墙工作 - 但是当我取消注释它时,程序会中断。代码本身似乎没有什么问题,它编译得很好,但不能按照我期望的方式工作。

感谢所有的帮助此致敬意

碰撞.h

#pragma once
#include "Ball.h"
class collision
{
public:
    collision();
    collision(Ball ball);
    void detect();
    ~collision();
private:
    Ball *point;
};

鲍尔·

#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 };
};

碰撞.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()
{
}

球.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()
{
}

主.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;
}

下面将导致程序在下次使用point时调用未定义的行为:

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

其中point定义为:

Ball *point;

问题是您正在存储具有自动存储持续时间的对象地址。 ball函数完成后将不复存在,因此point指向无效对象。

你可能想通过引用来接球;或者更好的是在你的程序中使用std::unique_ptrstd::shared_ptr的服务。

更改以下代码

collision::collision(Ball ball)

collision::collision(Ball& ball)

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