2017-08-24 178 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(); 
} 

而且我知道你說你問題不是關於單例實現,而是我認爲我會拋出這個問題,並說不要忘記阻止單身人員的複製構造和分配。