使用静态函数访问单例

时间:2017-08-24 14:03:12

标签: c++ singleton singleton-methods

考虑我有一个单例类Foo。这里的问题不是关于实现单身成语的方法,那么我不明确它。我有类似的东西:

class Foo
{
  private:
          Foo();
          ~Foo();
  public:
    void  doSomething();
    int   getSomething() const;
  public:
    static Foo&  getInstance();
};

然后,在我看来,传统的称呼方式如下:

Foo::getInstance().doSomething();
int i = Foo::getInstance().getSomething();

总是必须编写Foo::getInstance()来访问实例并执行预期的任务,这非常烦人。然后我的问题如下:如何将重复的函数作为静态函数,保持单例机制,但缩短访问时间?

class Foo
{
  private:
          Foo();
          ~Foo();
  public:
    void  doSomething();
    int   getSomething() const;
  public:
    static Foo&  getInstance();
    static void  _doSomething() { Foo::getInstance().doSomething(); }
    static int   _getSomething() { return Foo::getInstance().getSomething(); }
};

然后,我可以用这个较短的版本来调用它:

Foo::_doSomething();
int i = Foo::_getSomething();

这是常见的吗?有没有充分的理由不这样做(以及为什么)?是否有其他(更好的)方法来简化对单例类的调用?

注意:出于兼容性原因,我不会使用C ++ 11。

1 个答案:

答案 0 :(得分:1)

其他静态方法没有任何问题,可以缩短调用单例的其他方法。

如果另一个类经常调用单例的方法,那么考虑一个私有成员对另一个类中的单例的引用,这个单元将在构造该类时被设置(假设你的单例已经构造在另一个对象之前) #39;建设)。

class Bar{

private:
    Foo& fooRef;
    void doA();


public:
    Bar();
    ~Bar();
};

然后在构造函数中:

Bar() :
    fooRef(Foo::getInstance())
{}

现在为了便于在Bar :: doA()中使用,您可以致电:

void Bar::doA(){
    fooRef.doSomething(); 
}

而且我知道你说你的问题不是关于单身人员的实施,但是我想我会把它扔进来并说不要​​忘记防止复制构造和单身人士的分配。