1

コードにシングルトンデザインパターンを実装しました。

それが次のようになっていると仮定します。

class Singleton
{
  Singleton () {}
  static Singleton* s;
public:
  static Singleton* Get () {
    if (!s)
      s = new Singleton ();
    return s;
  }
};

私を困惑させるのは、このパターンの「初期化」です。.cppに私は入れました:

SingletonPointer* SingletonClass::s (0);

しかし、 defineにアクセスする方法がわかりません。どうしてそれが可能ですか?sprivate

TIA、ジル

4

5 に答える 5

8

Singleton パターンを使用する最善の方法は、まったく使用しないことです。

シングルトンが悪い理由の簡単な要約:

  1. それらは特別な制限のあるグローバルです。グローバルは、独自の理由で十分に悪いです。それらをシングルトンにすることは、悪さを増幅するだけです。
  2. オブジェクトのインスタンスが 1 つだけ必要な場合は、1 つだけ作成します。複数作成しないようにするために特別なデバイスが必要な場合は、コードのセマンティクスに何か問題があります。それをシングルトンにしても問題は解決しません。新しい問題が発生するだけです。
  3. シングルトンはスレッドでうまく機能しません。スレッドは十分に難しいです。それらを難しくしないでください。

シングルトンを使用しても問題は解決しません。既存のコードに誤ったセマンティクスを適用し、そのコードの将来の拡張を困難または不可能にし (明日 2 つ必要になったらどうでしょうか?)、新しい問題を追加します。簡単に言えば、それらを使用しないでください。

于 2011-04-12T13:59:04.193 に答える
5

静的フィールドには、宣言以外に定義が必要です。通常、宣言は .h ファイルのクラス宣言に含まれますが、定義はほとんどの場合 .cpp ファイルに含まれます。何かに初期化する必要があるため、静的変数の定義は必須です。

しかし、定義がクラス本体の外にあり、まったく別のファイルにあるとしても、それがクラスの一部ではないという意味ではありません。はSingletonClass::それを (クラス宣言ではなく) クラス定義の一部にするため、プライベート フィールドに「アクセス」できます。

クラス本体の外側で定義されたメソッドについても同じことが言えます。たとえば、次のようになります。

// A.h
class A
{
private:
    int b;
public:
    A(int x) : b(x)
    {}

    Do();
}

// A.cpp
A::Do()
{
    return b;
}
于 2011-04-12T14:06:37.693 に答える
2

初期化コードでは、にアクセス Singleton::sしているのではなく、定義しています。

于 2011-04-12T13:55:36.787 に答える
1

プライベート変数には、クラスのすべてのメソッドからアクセスできます。s変数にアクセスしている唯一の場所は、同じクラスに属するメソッドGet()です。

外部からsにアクセスしたい場合、直接アクセスすることはできませんが、Get()メソッド (パブリック) を呼び出す必要があり、そのメソッドは実際にsを返します。

使用法:

Singleton * s = SingletonClass::Get();
于 2011-04-12T14:03:30.473 に答える
0

外部からはGet(適切なタイプを指定した場合)経由でアクセスされます。それがそうであるという事実はprivate、そのメソッドがそれへのポインターを返すことを妨げません。メンバーは、名前によるprivateアクセスを防止するだけです。

于 2011-04-12T13:56:07.903 に答える