Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从另一个类调用时类中的方法出现问题_C++_Opengl_Pointers_Scenegraph - Fatal编程技术网

C++ 从另一个类调用时类中的方法出现问题

C++ 从另一个类调用时类中的方法出现问题,c++,opengl,pointers,scenegraph,C++,Opengl,Pointers,Scenegraph,我正在编写一个简单的场景图来保存一些对象,以便在OpenGL中控制这些对象的渲染和绘制。我有两个类,一个叫做GameObject,它定义了具有特定参数的对象,比如位置和速度,以及如何绘制对象。它有一个名为update()的方法,用于计算位置的任何变化,然后调用draw()将自身绘制到屏幕上 另一类称为Sceneode。这个类控制我用来存储对象的数据结构。这个类的实例包含一个指向GameObject实例的指针,允许我访问数据,并且一个sceneNode在向量中存储了sceneNode类型的子元素

我正在编写一个简单的场景图来保存一些对象,以便在OpenGL中控制这些对象的渲染和绘制。我有两个类,一个叫做GameObject,它定义了具有特定参数的对象,比如位置和速度,以及如何绘制对象。它有一个名为update()的方法,用于计算位置的任何变化,然后调用draw()将自身绘制到屏幕上

另一类称为Sceneode。这个类控制我用来存储对象的数据结构。这个类的实例包含一个指向GameObject实例的指针,允许我访问数据,并且一个sceneNode在向量中存储了sceneNode类型的子元素

每门课都能独立完成。我可以将孩子添加到场景图等,我可以创建一个游戏对象,并告诉它自己绘制,一切都按照预期进行

然后,我在Sceneode中添加了一个新方法,名为render(),该方法获取指向gameObject的指针,并在对节点的任何子节点调用render()之前调用其更新函数

问题是:调用update()方法并绘制游戏对象,但它始终绘制在同一位置,并且不移动,尽管有速度和位置变化。使用GameObject的实例调用update()函数确实会绘制对象并在屏幕上移动对象。我已经盯着这个代码看了好几个小时,看不出我遗漏了什么。我对从另一个类中调用指针和方法的想法还是相当陌生的,所以我可能错过了一些明显的东西

以下是相关方法:

GameObject.cpp: 位置、速度等变量被列为受保护变量

void GameObject::update(){

for (int i = 0; i<3;i++){
    this->velocity[i] +=this->acceleration[i];  
}
this->position[0] += this->velocity[0];
this->position[1] += this->velocity[1];
this->position[2] += this->velocity[2];

this->draw();
}


void GameObject::draw() {
glTranslatef(this->position[0], this->position[1], this->position[2]);

glBegin(GL_TRIANGLES);
for (int i = 0; i < this->num_tris; i++) {
    for (int j = 0; j <3 ; j++) {
        glVertex3fv(vertices[triangles[i].INDEXES[j]]);
    }
}
glEnd();
}
我不明白为什么render()方法的位置不变,而update()方法的位置不变,因为它们都在调用同一个东西


谢谢你的帮助这里有一些大问题

GameObject *go = new GameObject();
go = this->data;
您正在创建一个新对象,然后忘记了指向该对象的指针。每次调用render时都会发生这种情况,因此您有大量未使用的内存,这些内存会随着时间的推移而增长。你可以说:

GameObject *go = NULL;
创建指针而不向其分配数据

您还可以在任何地方忽略this->foo。这在所有类中都是隐含的


因此,尽管我看不到这段代码中的错误,但它可能在其他地方,因为您在上面的指针上犯了错误。你可能有指针指向你没有画的东西。如果在render()中查看正在更新的对象的内存地址和正在更新的对象的内存地址,它们实际上可能不同。如果是,那么您就知道您不是在对正在绘制的相同对象调用update。要获取内存地址,请查看函数调用中“this”的值。写下它们,并确保它们与正在绘制的对象相同。错误不在此代码中

在SceneNode中,当您将此->数据分配给go时,实际上是将go设置为null!取出该任务或执行此操作->data=new GameObject(),而不是使用go

向我们展示
GameObject
operator=
的定义。
go=this->data
行看起来可疑。我没有重新定义任何运算符,所以它只是一个标准的“=”运算符。这不是正确的方法吗?我听说过类型转换,但我认为这只是为了将字符更改为int或类似的东西?如果对象不是基本类型,那么这不是方法。
op=
帮助您在将类型为X的对象的值分配给另一个相同类型的对象时获得正确的副本。此->数据似乎是从其他地方分配的,因为您可以实际绘制。
GameObject *go = new GameObject();
go = this->data;
GameObject *go = NULL;