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

ですか?それをしない理由がありますか(なぜですか?)シングルトンクラスの呼び出しを単純化する他の(より良い)方法がありますか?

注:互換性の理由からC++ 11は使用しません。

+2

あなたは 'auto&instance = Foo :: getInstance();のようなものを考えましたか? instance.doSomething(); instance.getSomething(); '? –

+0

@FrançoisAndrieux:はい、もちろんです。シングルトンが同じスコープ内で複数回呼び出された場合は有効です。私はいくつかのスコープでの呼び出しについて考えます。しかしそれは良い点です。 – Caduchon

+0

@FrançoisAndrieux 'auto'はOPが彼が使うことができないと言ったC++ 11キーワードです。 – muXXmit2X

答えて

1

シングルトンの他のメソッドを呼び出すのに短くする他の静的メソッドには何も問題はありません。

他のクラスがシングルトンのメソッドを頻繁に呼び出す場合は、そのクラスの構築時に設定される他のクラスのシングルトンへのプライベートメンバ参照を考慮してください(あなたのシングルトンは他のオブジェクトの構築前に構築されていると仮定します)。あなたが呼び出すことができるバーでの使用を容易にするため

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

そして今:: DOA():

コンストラクタで
class Bar{ 

private: 
    Foo& fooRef; 
    void doA(); 


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

そして

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

そして、私はあなたの言った知っています質問はシングルトンの実装に関するものではありませんでしたが、私はこれを投げ込み、シングルトンのコピー構築と割り当てを防ぐことを忘れないでください。

関連する問題