在进行了某些其他初始化之后,如何初始化类的静态成员?

时间:2010-10-28 15:09:16

标签: c++

我希望能够在以下类中初始化静态成员scalingfactor

class ScalingRect: public Rect
{
public:
    static float scalingfactor;

    ...
};

我以为我会在.cpp

中使用另一个类的静态成员函数初始化它
float ScalingRect::Rect = Engine::GetScaleFactor();

但是,我不想在GetScaleFactor()课程准备好之前致电Engine。如何确保在合适的时间调用它?

2 个答案:

答案 0 :(得分:2)

而不是将static作为类成员,在静态方法中使其成为静态,并返回对它的引用:

class ScalingRect: public Rect
{
public:
    static float& scalingfactor()
    {
      if (!Engine::initilized()) throw ("initilize Engine first!");
      static float value = Engine::GetScaleFactor();
      return _value;
    }

    ...
};

现在第一次调用scalingfactor()应理想地位于initiliazer for Engine的末尾,或者只要你确保在Engine初始化程序完成后第一次调用scalingfactor()就会发生这种情况。

答案 1 :(得分:1)

您可以在GetScaleFactor中实现按需初始化(如果需要,可以使用合适的防护线程来保护线程):

float Engine::GetScaleFactor()
{
  if (!Engine::initialized())
  {
    // do the engine init here, making sure no other thread is already in progress
  }
  return scaleFactor;
}