0

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

班级

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

4

2 回答 2

1

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

于 2013-10-22T14:18:23.843 回答
0
  • 您的Object3D班级是否只保留指向网格的指针或复制它?
  • 它是否实现了深拷贝复制构造函数?

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

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

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

...并丢失局部变量tri,meshobj.

于 2013-10-22T14:22:38.570 回答