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

Static C++ variable, without default constructor, loses value

本文关键字:变量 C++ 静态 默认 构造函数      更新时间:2023-10-16

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

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 中看到的那样,那里一切正常。所以我不知道发生了什么。

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

  • 您的Object3D类是只保留指向网格的指针还是获取它的副本?
  • 它是否实现了深拷贝构造函数?

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

编辑:或者,由于这看起来像游戏开发,快速而讨厌地完成它! ;-)

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

。并丢失局部变量 trimeshobj