另一个c++台球对象数组问题

another c++ pool ball object array issue

本文关键字:数组 问题 对象 c++ 另一个      更新时间:2023-10-16

所以我有一个问题,当我请求位置时,我似乎总是得到最后一个球的位置。当我声明对象时,好像对象中的值没有被正确赋值。

这是我目前的数据

ball TestBall[2];

在方法中声明变量

void ball::Placeball() {
    //TEMP TEST
    TestBall[1].DrawBall(5,0.15,10,3,10);
    //TEMP TEST
    TestBall[2].DrawBall(5,0.15,10,3,30);
}

我的drawball方法和变量是如何传递的

void ball::DrawBall(float radius, float mass, float x, float y, float z) {
    xPos = x;
    yPos = y;
    zPos = z;
    GLUquadricObj *quadratic;
    quadratic = gluNewQuadric();
    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK,GL_FILL);
    gluQuadricNormals(quadratic,GLU_SMOOTH);
    glTranslatef(x,y,z);
    gluSphere(quadratic,radius,20,20);
    glTranslatef(-x,-y,-z);
}

传递变量我不能工作

float ball::zPos

和它是如何被检索的

float ball::GetZ() const {
    return zPos;
}

然后是如何获取值

cout << TestBall[1].GetZ() << endl; //should be 10
cout << TestBall[2].GetZ() << endl; //should be 30

ball.cpp :

float ball::xPos = 0;
float ball::yPos = 0;
float ball::zPos = 0;
ball::ball() { };
void ball::DrawBall(float radius, float mass, float x, float y, float z) {
    xPos = x;
    yPos = y;
    zPos = z;
    GLUquadricObj *quadratic;
    quadratic = gluNewQuadric();
    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK,GL_FILL);
    gluQuadricNormals(quadratic,GLU_SMOOTH);
    glTranslatef(x,y,z);
    gluSphere(quadratic,radius,20,20);
    glTranslatef(-x,-y,-z);
}
float ball::GetX() const {
    return xPos;
}
float ball::GetY() const {
    return yPos;
}
float ball::GetZ() const {
    return zPos;
}

ball.h :

#pragma once
class ball
{
private:
    static float xPos;
    static float yPos;
    static float zPos;
public:
    ball();
    ball(float radius, float mass, float x, float y, float z){};
    ~ball(){};
    static void DrawBall(float radius, float mass, float x, float y, float z);
    static void UpdateBall(float speedx, float speedz);
    static void Placeball();

    float GetX() const;
    float GetY() const;
    float GetZ() const;
};

两个值都是30,如果我增加对象数组的大小,这是同样的问题。

很可能是我错过了一些简单的东西。

感谢您的宝贵时间。

在c++中,数组索引是从0开始的,所以ball TestBall[2];的有效索引是TestBall[0]TestBall[1]。访问TestBall[2]会调用未定义的行为,并且写入它肯定会导致内存损坏。

EDIT:(回答正在编辑的问题以显示ball的定义)

xPos, yPos, zPos, DrawBall, UpdateBallPlaceball中删除static,行为应该如您所料。您需要在ball的构造函数中初始化xPosyPoszPos,而不是在命名空间范围内。