2017-08-24 119 views
1

考虑我有一个单独的类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(); 

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

注:我不使用下的兼容性原因++ 11。

+2

你有没有考虑像'汽车及实例=富::的getInstance(); instance.doSomething(); instance.getSomething();'? –

+0

@FrançoisAndrieux:是的,当然。如果在同一个范围内多次调用单例,那么这是有效的。我想到几个范围内的电话。但这是一个很好的观点。 – Caduchon

+0

@FrançoisAndrieux'auto'是OP所说的他不能使用的C++ 11关键字。 – muXXmit2X

回答

1

没有什么错与其他静态方法,它缩短打电话给你单身的其他方法。

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

class Bar{ 

private: 
    Foo& fooRef; 
    void doA(); 


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

然后在构造函数中:

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

而现在为了便于在酒吧:: DOA(使用)的您可以拨打:

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

而且我知道你说你问题不是关于单例实现,而是我认为我会抛出这个问题,并说不要忘记阻止单身人员的复制构造和分配。