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

时间:2017-02-04 21:44:46

标签: c++ opengl static

我有一个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();
}

^这会编译^

1 个答案:

答案 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>代替。

相关问题