皆さんご存知のとおり、インターネット上には、自分が何と呼ばれているのかわからないシングルトンが存在し、あらゆる種類の乱雑な書き込みがあるという噂があります。シングルトンは常に 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() {};
};