我有一个带有静态变量的类。因为我需要一个不是默认的构造函数,所以我有点困惑,但我希望我做得很好
类
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;
}
问题是在return之前在comment中插入的那个
然后当我需要将该对象传递给渲染函数时,如下所示;应用程序关闭,因为我正在尝试访问未初始化的内存位置
void Engine::OnRender(){
Rendering.WfRender(Object3D::ObjControl, Surf_Display, 1);
}
我认为我对静态变量做错了,但我对 Camera 类的静态变量做了同样的事情,正如您在 Engine::OnInit 中看到的那样,一切正常。所以我不知道发生了什么。
最佳答案
程序中的主要问题是您在函数中创建了一个 Triangle 实例(网格)并将指针传递给静态成员变量 ObjControl。当您离开该函数时,网格不再可用,因此 ObjControl 指向一个无效实例。这可以通过在 Object3D 中存储实际的三角形而不是指向三角形的指针或三角形容器(如果需要更多三角形)来解决。
关于c++ - 没有默认构造函数的静态 C++ 变量丢失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520229/