正在初始化初始化函数中的静态类成员

Initializing static class members in an initialize function

本文关键字:初始化 静态类 成员 函数      更新时间:2023-10-16

我有一个c++static类的私有静态成员(非常类似于singleton类,但不需要分配该类的实例,因为它是自动完成的)。

无论如何,我想初始化这个静态成员。通常,人们会通过进行以下来实现这一点

示例.h

class Example
{
private:
static OtherClass _value;
Example() {}
};

示例.cpp

#include "Example.h"
OtherClass Example::_value(constructor arguments)

我目前正在编写的代码不允许这样做。本质上,我正在为OpenGL编写一个DebugDraw类,该类将包含它自己的着色器对象的静态成员,该着色器对象将创建OpenGL着色器。如果我使用上面的方法,着色器将在glew初始化之前构建,这将导致一些主要问题。

这就是我正在使用的解决方案。

示例.h

class Example
{
public:
Initialize();
private:
static OtherClass _value;
Example(){}
};

示例.cpp

#include "Example.h"
Example::Initialize()
{
OtherClass _value(constructor arguments)
// Other code that I will need to add
}

这样写的代码会编译,但它会有我想要的效果吗(初始化静态类成员)?在调用Initialize函数之前,这对静态成员意味着什么(我也打算在其中放入一个初始化的bool)?

感谢

这是我正在使用的实际代码。

DebugDraw.h

#ifndef DEBUGDRAW_H
#define DEBUGDRAW_H
#include <GLMglmvec4.hpp>
#include "Shader.h"
class DebugDraw
{
public:
static void Initialize();
static void Line();
static void Triangle();
static void Box();
static void Color();
private:
static glm::vec4 _color;
static Shader _shader;
DebugDraw() {}
};
#endif // !DEBUGDRAW_H

DebugDraw.cpp

#include "DebugDraw.h"
void DebugDraw::Initialize()
{
glm::vec4 _color(1.0f, 1.0f, 1.0f, 1.0f);
Shader _shader("Shader/debug.vert", "Shader/debug.frag");
_shader.Use();
}

^这确实编译了^

在调用Initialize函数之前,这对静态成员意味着什么(我也打算在其中放入一个初始化的bool)?

您正在创建一个名为_val的局部变量(应该是_value?),它与静态变量无关。因此,您的代码甚至不会链接。


要执行您想要的操作,您需要初始化变量,就像您在第一个Example.cpp中所显示的那样,但没有任何构造函数参数:

#include "Example.h"
OtherClass Example::_value;

请确保无参数构造函数不会执行任何实际初始化!我们将通过制作OtherClass::initialize方法来延迟这一过程。

#include "Example.h"
OtherClass Example::_value;
Example::Initialize()
{
Example::_value.initialize(...);
}

或者,您可以将_value作为指针,将其分配给NULL,并在需要时在堆上分配:

#include "Example.h"
OtherClass *Example::_value = NULL;
Example::Initialize()
{
Example::_value = new OtherClass(...);
}

当你不再需要它的时候,别忘了delete。或者,如果可以使用C++11,请使用std::shared_ptr<OtherClass>