2017-04-15 47 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()函數中創建的對象的地址。