没有默认构造函数的静态C ++变量会丢失值

时间:2013-10-22 14:08:41

标签: c++ sdl static-variables

我有一个带静态变量的类。因为我需要一个不是默认的构造函数,所以我有点困惑,但我希望我做得很好

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中看到的那样,一切都运行良好。所以我不知道发生了什么。

2 个答案:

答案 0 :(得分:1)

程序中的主要问题是在函数中创建一个Triangle实例(网格),并将指针传递给静态成员变量ObjControl。当您离开该函数时,网格不再可用,因此ObjControl指向无效的实例。这可以通过存储实际三角形而不是指向Object3D中的三角形或三角形容器的指针来解决,如果需要更多的话。

答案 1 :(得分:0)

  • 你的Object3D类只保留指向网格的指针或者复制它吗?
  • 它是否实现了深拷贝复制构造函数?

我问,因为您的mesh在分配到obj后超出范围,obj在分配给静态变量后超出范围。您需要在堆上分配网格并将该指针交给静态变量,或者通过正确实现正确的构造函数来确保复制实际数据。

编辑:或者,因为这看起来像游戏开发,快速和令人讨厌! ; - )

Object3D::ObjControl.mesh = new Triangle(vertexA, vertexB, vertexC);

...并丢失局部变量trimeshobj