3

考虑我有一个单例类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。

4

1 回答 1

1

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

如果另一个类经常调用单例的方法,那么请考虑在其他类中对单例的私有成员引用,该引用将在构造该类时设置(假设您的单例已在其他对象的构造之前构造)。

class Bar{

private:
    Foo& fooRef;
    void doA();


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

然后在构造函数中:

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

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

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

而且我知道您说您的问题与单例实现无关,但我想我会把它扔进去并说不要忘记防止单例的复制构造和分配。

于 2017-08-24T15:17:08.320 回答