2

class Tプログラム全体でインスタンスを 1 つだけ生成できる が必要です。

今私は知ってstd::unique_ptrいますが、2つの問題があります:

  • それはスコープに限定されています(しかし、それは大きな問題ではありません...)
  • 明示的に使用する必要があります。つまり、クラスや型の一部ではなく、単なるハンドラーと特別なポインターですが、クラスのデザインを変更するものではありません。

今、私は、ユーザーが同じプログラムで2つのインスタンスを誤って宣言することさえできないように設計したいと考えています。これを設計で解決したいので、ユーザーがforclass Tを宣言するという事実に頼ることはできません。std::unique_ptrT

今のところunique_ptr、エレガントな方法で暗黙のうちに使用する方法についてのみ考えています。問題は、現時点では手がかりがないことです。

逆に、このクラスが によって処理されているかどうかをunique_ptr確認することもできますが、このチェックではパフォーマンスの面で優位性が失われます。

インスタンスを 1 つだけ持つことが非常に重要であるため、私の場合は 2 つのオプションしかありません。

これは些細に見えることはわかっていますが、設計アプローチでは、少なくとも私にとってはそうではないので、助けてください。

4

3 に答える 3

4

あなたが探しているのはシングルトンパターンと呼ばれ、多くの人(私自身を含む)によってアンチパターンであると広く考えられていますが、それでも、それを構築するために必要な基本的な要素を紹介します。

基本的にあなたがする必要があるのは3つのことを提供することです:

  1. static唯一のインスタンスを「取得」するメソッド
  2. コンストラクター。private誰もそれをインスタンス化できないようにします
  3. main(オプション)開始前に唯一のインスタンスを作成する手段

重要なコードは次のとおりです。

class Singleton
{
public:
  Singleton&  get() 
  { 
    static Singleton me_;
    return me_;
  }
private:
  Singleton() {};
};

上記の#3を実装する方法と、そもそもシングルトンを使用すべきではない理由を見つけるのはあなたに任せています。多くの理由があります。

于 2012-10-08T19:35:18.563 に答える
3

これは通常、シングルトンと呼ばれます。

http://en.wikipedia.org/wiki/Singleton_patternを参照してください

C ++の典型的なトリックは、参照によってシングルトンインスタンスを返す関数を用意し、コンストラクターをプライベートにすることです。

何かのようなもの:

#include <iostream>
using namespace std;

class Foo
{
private:
  Foo() : a(3) { a++; }
  static Foo singleton;
  int a;
public:
  static Foo& getFoo() { return singleton; }
  void doStuff() { cout<<"My a is: "<<a<<endl; }
};

Foo Foo::singleton;

int main(int argc, char** argv)
{
  Foo::getFoo().doStuff();
  Foo &foo = Foo::getFoo();
  foo.doStuff();

  //uncomment below to cause compile error                                                                                                                                                                                                                                                                                                                                
  //Foo foo2;                                                                                                                                                                                                                                                                                                                                                             
}

実際のコードでは、これをヘッダーとcppファイルに分割することに注意してください。その場合、

Foo Foo::singleton;

一部はcppファイルに入れる必要があります。

于 2012-10-08T19:32:44.773 に答える
2

あなたは少なくとも持つことができます

 static int count;
 assert(count == 0);
 count++;

シングルトン クラスのコンストラクタで。これは、コンパイル時にクラスがシングルトンであることを保証しませんが、少なくとも実行時にそれをチェックします。

また、コンストラクターをプライベートにして、インスタンスへのポインターを (1 回) 返す静的メンバー関数を持たせることもできます。おそらく次のようなものです。

 class Singleton {
 private:
    Singleton() {
      static int count;
      assert(count == 0);
      count++;
    };
    Singleton(Singleton&) = delete;
 public:
    static Singleton* the_instance() {
      static Singleton* it;
      if (!it) it = new Singleton();
      return it;
    }
 };
于 2012-10-08T19:31:07.397 に答える