4

シングルトンについて何百万もの質問と回答があることは知っていますが、これに対する解決策を見つけることができないようです. したがって、反対票のリスクを冒すと、ここに私の問題があります:

Andrei Alexandrescu の Modern C++ Design からこのシングルトン実装を使用したいと思います。

ヘッダ:

class Singleton
{
    static Singleton& Instance();
  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};

実装:

#include "s.hh"

Singleton& Singleton::Instance()
{
    static Singleton instance;
    return instance;
}

テスト:

#include "s.hh"

int main(void)
{
    Singleton& single = Singleton::Instance();
    return 0;
}

今、

$g++ A.cc s.cc  && ./a.out 
In file included from A.cc:1:0:
s.hh: In function ‘int main()’:
s.hh:3:19: error: ‘static Singleton& Singleton::Instance()’ is private
 static Singleton& Instance();
               ^
A.cc:6:42: error: within this context
  Singleton& single = Singleton::Instance();
                                      ^

それの何が問題なのですか?ハマった...

4

5 に答える 5

4

デフォルトでは、クラスのメンバーはプライベートです。Singleton::Instanceシングルトンにアクセスするには、公開する必要があります。

class Singleton
{
  // here!
  public:
    static Singleton& Instance();

  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};

これはコンストラクターではないことに注意してください(タイトルで述べたように)、シングルトンへの参照を返すはずの静的メンバー関数です。

于 2013-04-06T07:54:00.243 に答える
3

a のデフォルト アクセスclassはであるため、メソッドを明示的privateに作成する必要があります。Instance()public

class Singleton
{
 public:
    static Singleton& Instance();
 private:
   // as before
....
};

structまたは、デフォルトのアクセス指定子が public である を使用することもできます。

struct Singleton
{
    static Singleton& Instance(); // public
  private:
    Singleton(){};
    Singleton(const Singleton&){};
    Singleton& operator=(const Singleton&){};
    ~Singleton(){};
};
于 2013-04-06T07:53:49.023 に答える
3

クラスのデフォルトのアクセス指定子はprivate. publicアクセス指定子の下にメソッドを追加します。

public:
    static Singleton& Instance();

よく読んでください:
アクセス指定子とは? プライベート、プロテクト、またはパブリックで継承する必要がありますか?

于 2013-04-06T07:54:04.060 に答える
2
class S
{
    public:
        static S& getInstance()
        {
            static S    instance; 

            return instance;
        }
    private:
            // other stuff here
};
于 2013-04-06T07:55:22.860 に答える