正在初始化初始化函数中的静态类成员
Initializing static class members in an initialize function
我有一个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>
。
- 在 C++11 中轻松初始化模板类的静态成员,没有 clang 警告
- 如何从静态类函数初始化静态类对象
- 如何初始化对类内变量的静态引用,以便在嵌套类中使用
- 如何在 c++ 中初始化静态类对象?
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 大括号使用枚举类初始化静态常量unordered_map
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 使用静态方法初始化 const 类字段的做法是好是坏
- 使用折叠表达式初始化静态 constexpr 类数据成员不编译
- 初始化静态成员类(用于信号处理程序)
- 正在初始化静态类中的静态指针
- 哪个函数用于初始化静态类成员
- 正在初始化静态类成员
- 初始化静态类成员,它是另一个类对象
- 如何默认初始化静态类模板变量
- 如何使用非平凡构造函数初始化静态类成员
- 如何初始化静态类的简单习惯用法的d(指针)