C++ シングルトン

        皆さんご存知のとおり、インターネット上には、自分が何と呼ばれているのかわからないシングルトンが存在し、あらゆる種類の乱雑な書き込みがあるという噂があります。シングルトンは常に 1 つのインスタンスを保持します。C++ で実装されているため、注意する必要があるのは 2 つの点だけです。2時どこですか?この2点をコピーして構築し、コピーしてコピーします。

        C++ のデフォルト クラスには、6 つのコンストラクターがあります。上記 2 つを無効にすれば問題ありません。新しい機能 (=削除) を使用します。「ああ、どんなテンプレートを使っているんだ、新しいのがある」とか言う人もいます。今日これを書きました。

class Singleton
{
public:
	static Singleton& GetInstance()
	{
		static Singleton instance;

		return instance;

	}
	Singleton(const Singleton&) = delete; //这个叫拷贝构造
	Singleton& operator =(const Singleton&) = delete;//拷贝赋值
	~Singleton() {};

private:
	Singleton() {}; //默认构造函数
};


class A      //有些人可能会这么写,这是不是也可以。
{
public:

	static A& GetInstance();

private:
	A() {};
	A(const A& rts);
};

A& A::GetInstance()
{
	static A a;
	return a;
}



int main()
{
	Singleton& sing = Singleton::GetInstance(); //得到一个实例

	A &a = A::GetInstance();
}

これは、C++ クラス クラスのアプリケーションの結果を完全に反映していますか。

 

これはコンパイラのプロンプトに従って変更したものです。これは違いますか? コンパイルはできますが、インスタンスを常に維持するという規約に違反します。プライベートなものを書くとエラーが報告され、共有のものを書くと契約に違反します。

template<typename T>
class Singleton
{
public:
	static T& GetInstance()
	{
		static T instance;
		return instance;
	}
	Singleton() { cout << "this is construction"; };  //共有的构造   //这两行错了
	~Singleton() {};                            //虚的析构没写
	Singleton(const Singleton& ) = delete;
	Singleton& operator = (const Singleton & ) = delete;
private:
	//Singleton() { cout << "this is construction"; };  写这里报错 访问不到
};
class A :public Singleton<A>
{
public:
	friend class Singleton<A>;
private:
	A() {};
	~A() {};

};


int main()
{

	A& a = Singleton<A>::GetInstance();
	A& b = Singleton<A>::GetInstance();
}

それで、これをもう一度見てください、変更されたシングルトンです。今回は、フレンド、プライベート、共有、継承、保護がすべて利用可能になります。仮想デストラクターもあります。これ。完璧ですか?そうあるべきだ。もっと高いものはありますか。もつ!

template<typename T>
class Singleton
{
public:
	static T& GetInstance()
	{
		static T instance;
		return instance;
	}

protected:
	Singleton() { cout << "this is construction"; };  //必须的
	virtual ~Singleton() {};
	Singleton(const Singleton& ) = delete;
	Singleton& operator = (const Singleton & ) = delete;

};
class A :public Singleton<A>
{
	friend class Singleton<A>;
private:
	A() {};
	~A() {};

};

以下は普通の人が書いてはいけません。結局のところ、使用レベルは人それぞれ異なります。誰が毎日大量の新機能をプルするのか。よく見てください、これはあなたの上のものと同じではありませんか?はい。ただし、他にも多くの規約があります。より優れたセキュリティを提供します。

template<typename T>
class Singleton
{
protected:
	Singleton()noexcept = default;

	Singleton(const Singleton&) = delete;

	Singleton& operator =(const Singleton&) = delete;

	virtual ~Singleton()noexcept = default;

public:

	static T& GetInstance()noexcept(std::is_nothrow_constructible<T>::value)
	{
		static T instance{};  

		return instance;
	}
	
};
class A :public Singleton<A>
{
//public:
	friend class Singleton<A>;
	
private:
	A() {};
	~A() {};

};

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_36912885/article/details/122171272