我有一个带静态变量的类。因为我需要一个不是默认的构造函数,所以我有点困惑,但我希望我做得很好
类
class Object3D{
public:
static Object3D ObjControl;
Object3D(); //this is here just for the initialization of the static variable
Object3D(Triangle *mesh);
Triangle *mesh;
};
此时我需要创建一个Object3D,我按如下所示
bool Engine::OnInit() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return false;
}
if((Surf_Display = SDL_SetVideoMode(WIDTH, HEIGTH, BBP, FLAGS)) == NULL) {
return false;
}
arma::colvec::fixed<3> upDirection;
upDirection << 0 << 1 << 0;
Camera cam(0.0, 0.0, 10.0, 10.0, 200.0, 90.0, upDirection);
Camera::CameraControl = cam;
arma::colvec::fixed<3> vertexA;
vertexA << -1 << 1 << 0;
arma::colvec::fixed<3> vertexB;
vertexB << 1 << 1 << 0;
arma::colvec::fixed<3> vertexC;
vertexC << 0 << -1 << 0;
Triangle tri(vertexA, vertexB, vertexC);
Triangle mesh[1];
mesh[0] = tri;
Object3D obj(mesh);
Object3D::ObjControl = obj; // PROBLEM! -> when the function extis from the OnInit ObjControl doesn't have anything inside.. it is like cleaned at the exit
return true;
}
问题是返回前在评论中插入的问题。
然后当我需要将该对象传递给渲染函数时,如下所示;应用程序关闭,因为我正在尝试访问未初始化的内存位置
void Engine::OnRender(){
Rendering.WfRender(Object3D::ObjControl, Surf_Display, 1);
}
我认为我对静态变量做了一些错误,但我对Camera类的静态变量做了同样的事情,正如你在Engine :: OnInit中看到的那样,一切都运行良好。所以我不知道发生了什么。
答案 0 :(得分:1)
程序中的主要问题是在函数中创建一个Triangle实例(网格),并将指针传递给静态成员变量ObjControl。当您离开该函数时,网格不再可用,因此ObjControl指向无效的实例。这可以通过存储实际三角形而不是指向Object3D中的三角形或三角形容器的指针来解决,如果需要更多的话。
答案 1 :(得分:0)
Object3D
类只保留指向网格的指针或者复制它吗? 我问,因为您的mesh
在分配到obj
后超出范围,obj
在分配给静态变量后超出范围。您需要在堆上分配网格并将该指针交给静态变量,或者通过正确实现正确的构造函数来确保复制实际数据。
编辑:或者,因为这看起来像游戏开发,快速和令人讨厌! ; - )
Object3D::ObjControl.mesh = new Triangle(vertexA, vertexB, vertexC);
...并丢失局部变量tri
,mesh
和obj
。