8

シングルトンクラスの実装で代入演算子を民営化する必要性を誰かが正当化できますか?

Singleton& operator=(Singleton const&);プライベートにすることでどのような問題が解決しますか?

class Singleton {
public:
  static Singleton& Instance() {
    static Singleton theSingleton;
    return theSingleton;
  }

private:
  Singleton(); // ctor hidden
  Singleton(Singleton const&); // copy ctor hidden
  Singleton& operator=(Singleton const&); // assign op. hidden
  ~Singleton(); // dtor hidden
};
4

7 に答える 7

12

シングルトンへの割り当ては、そのオブジェクトが1つだけ存在する必要があるため、単にナンセンスな操作です。

代入演算子をプライベートにすると、次のようなナンセンスコードの診断に役立ちます。

Singleton& a = Singleton::Instance();
Singleton& b = Singleton::Instance();
a = b; // Oops, accidental assignment.
于 2011-07-12T15:08:37.470 に答える
2

シングルトンは1つだけです。それをコピーするのは意味がありません。コピーが正常であるためには2つのことが必要であり、ほとんどのコピーオペレーターはself==&other安全のためにチェックする必要があります。

このprivateトリックはハックです。C++0xの方が優れています。

暴言を始める...

私見シングルトンは、用語の矛盾です。これは、カプセル化するためにすべてがオブジェクトでなければならないという愚かな考えの産物です。これは、Javaなどが抱えていたのと同じ頭の痛い問題ですMath.sin(x)

「シングルトン」が名前空間内の無料の関数のセットである場合、あなたの生活はよりシンプルになります。シングルトンのプライベートな「メンバー」は、.cppの匿名の名前空間に隠すことができます。カプセル化が達成され、面倒な余分な構文はありません。

MyNamespace :: foo ();

それ以外の

MyClass :: instance () .foo ();
于 2011-07-12T15:08:00.793 に答える
2

インスタンスが1つだけ必要な場合は、コピーコンストラクターをプライベートにする必要があります。とにかく使用することは不可能であるため、代入演算子のアクセス指定子は重要ではありません。

于 2011-07-12T15:09:31.490 に答える
1

代入できるようにするには2つのインスタンスが必要なので、代入演算子をプライベートにしても実際には何も変わりません。それは人々が見ることを期待するかもしれないものに対応しています。通常、コピーコンストラクターがプライベートの場合、代入演算子もプライベートです。プライベート代入演算子を宣言することは、単に人々の期待に対応しています。

于 2011-07-12T15:32:34.390 に答える
0

シングルトンを使用する場合、それを実装する理由は、そのクラスのオブジェクトのインスタンスを1つだけ必要とするためです。つまり、インスタンスは1つしかないため、インスタンスのコピーを作成する必要はありません。コピーコンストラクターも同様です。

于 2011-07-12T15:09:25.613 に答える
0

私の推論はこれです:インスタンスが1つしかない場合、operator =は重要なことを何もしないので、問題なく定義できます。プライベートにすると、コンパイラーは、その演算子をエラーとして使用しようとする試みにフラグを立てることにより、もう1つのレベルの安全性を追加します。

ちなみに、同じ理由がデストラクタにも当てはまります。

于 2011-07-12T15:12:06.347 に答える
0

プライベートコピーの構築と代入演算子を定義するよりも、シングルトンクラスパターンで(プライベートに)boost::noncopyableを継承します。

于 2011-09-27T07:47:47.473 に答える