静的関数以外のクラスのインスタンスを作成することを誰にも許可したくない場合 (これは singleton/factory と呼ばれると思いますか?)、デフォルトのコンストラクターをプライベートにするだけで十分ですか、それとも明示的にする必要がありますか?コピーコンストラクターと代入演算子を定義してプライベートにしますか?
4 に答える
コンストラクターを非公開にするのは、ファクトリ メソッド パターン用です。シングルトン パターンにはファクトリ メソッドが必要です。
クラスをコピーしたくない場合は boost にコピー不可がありますが、James McNellis がすでにコメントしているように、ユーザーがクラスをコピーできるかどうかを決定してください。生のポインタと固有のメモリ管理はクラス内に存在するべきではないため、クラスをコピーするという問題は、ほとんどの場合、リソースまたは場合によっては大きなコンテナーを使用するクラスに当てはまります。
はい、これら 3 つのマネージャー機能をすべて実行します。そうでない場合は、コピー コンストラクターにアクセスできないようにする必要があります。たとえば、これは有効です。
Singleton * s;
Singleton copy( *s );
したがって、次のようにします。
class Singleton
{
private:
Singleton();
Singleton(const Singleton &);
Singleton & operator = (const Singleton &);
};
はい、通常はそうする必要があります。そうでない場合は、コピーして新しいオブジェクトを作成できます。
MyClass newObject = your_singleton_of_type_MyClass;
この場合、コピーコンストラクターが発行され、実際に2つのオブジェクトが作成されます。コピーコンストラクターをプライベートにすると、このコードが不正になるため、コピーが防止されます。
インスタンスが1つだけ必要な場合は、そうです。コピーコンストラクターはプライベートである必要があります。とにかく使用することは不可能になるので、代入演算子は重要ではありません。