1

重複
の可能性:グローバルにアクセスできないシングルトン

このオブジェクトをC++でグローバルにすることなく、オブジェクトの1つのインスタンスのみが作成されるようにする優れたデザインパターンを知っていますか?それはシングルトンが行うことですが、コードアクセスのセキュリティ上の理由からグローバルである必要はありません。

ご協力いただきありがとうございます!

4

4 に答える 4

2

私はあなたがこのようなものが欲しいと思います(注:私がすでに書いた答えからコピーして貼り付けて忘れました):

#include <stdexcept>

// inherit from this class (privately) to ensure only
// a single instance of the derived class is created
template <typename D> // CRTP (to give each instantiation its own flag)
class single_instance
{
protected: // protected constructors to ensure this is used as a mixin
    single_instance()
    {
        if (mConstructed)
            throw std::runtime_error("already created");

        mConstructed = true;
    }

    ~single_instance()
    {
        mConstructed = false;
    }

private:
    // private and not defined in order to
    // force the derived class be noncopyable
    single_instance(const single_instance&);
    single_instance& operator=(const single_instance&);

    static bool mConstructed;
};

template <typename T>
bool single_instance<T>::mConstructed = false;

これで、クラスが複数回構築された場合に例外が発生します。

class my_class : private single_instance<my_class>
{
public:
    // usual interface (nonycopyable)
};

int main()
{
    my_class a; // okay
    my_class b; // exception
}

ただし、C++ではコンパイル時に単一インスタンスポリシーを適用する方法はありません。


(シングルトンがばかげていることに気づいても良かったです。グローバルにアクセス可能で、単独で作成できるのは2つの異なる概念であり、設計ではなく偶然によってのみ組み合わせる必要があります。)

于 2011-12-24T00:36:34.427 に答える
1

典型的な静的アクセス関数でシングルトンを使用できますInstance()が、この関数を作成しますprivate。その後、アクセスは、シングルトンクラスのフレンドクラスにすることにより、別のクラスにのみ許可されます。

于 2011-12-24T00:08:34.803 に答える
0

コンストラクターとassignemntオペレーターをプライベートにします。

次に、クラスの1つのインスタンスを作成する唯一の関数をクラスのフレンドにします。
関数を作成しているので、オブジェクトを作成できるのはそれだけです(そして、アプリケーションには他の関数はありません)。

于 2011-12-24T00:09:14.660 に答える
0

シングルトンクラス/インスタンスメソッドの可視性を制御するには、名前空間やネストされたローカルクラスを使用します

シングルトンチュートリアル http://www.yolinux.com/tokyoS/C++Singleton.html

ローカルクラスの例 http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=191

于 2011-12-24T00:12:58.910 に答える