没有默认构造函数的静态C++变量会丢失值
Static C++ variable, without default constructor, loses value
>我有一个带有静态变量的类。由于我需要一个不是默认的构造函数,所以我有点困惑,但我希望我做得很好
类
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);
。并丢失局部变量 tri
、 mesh
和 obj
。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用