我有一个c ++ static 类的私有静态成员(非常类似于单例类,但不需要分配类的实例,因为它是自动完成的。)
无论如何,我想初始化这个静态成员。通常,人们可以通过以下方式来实现这一目标
example.h文件
class Example
{
private:
static OtherClass _value;
Example() {}
};
Example.cpp
#include "Example.h"
OtherClass Example::_value(constructor arguments)
我目前正在撰写的代码不会允许这样做。本质上我正在为OpenGL编写一个DebugDraw类,该类将包含自己的静态成员,用于创建OpenGL着色器的Shader对象。如果我使用上面的方法,Shader将在glew初始化之前构建,这将导致一些重大问题。
这是我正在玩的解决方案。
example.h文件
class Example
{
public:
Initialize();
private:
static OtherClass _value;
Example(){}
};
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 <GLM\glm\vec4.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();
}
^这会编译^
答案 0 :(得分:0)
调用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>
代替。