2

プログラムの実行中に、特定のクラスの少なくとも 1 つのインスタンスが常に存在するようにする必要があります。(他の理由の中でも) 将来により多くのインスタンスが必要になる可能性があるため、Singleton は役に立ちません。静的クラスでもいいかもしれませんが、それはグローバルに行くような気がします...また、関数と変数の両方のプライベートメンバーが欲しいです。

shared_ptr を安全な場所に保管することを考えましたが、それは大まかなハックのようです。

これを行う標準的な方法はありますか?

編集

明確にするために、インスタンスがまだ存在するかどうかを確認できるかどうかは問題ではありません。インスタンスは常に存在する必要があります。その理由は、クラスに静的メンバー変数があり、その状態を維持する必要があるためです。

4

4 に答える 4

1

私は常に、コンストラクターでインクリメントされ、デストラクタでデクリメントされる内部静的カウンターを使用してこれを実装します。

はい、間違いなく、「少なくとも 1 つのインスタンス」をチェックするメソッドは静的でなければなりません。

更新:わかりました、ここで回答にエラーが表示されるので、回答を投稿します:

class Test
{
private:
  static int m_count;
public:
  Test() { ++m_count; }
  Test(const Test&) { ++m_count; }

  ~Test()
  {
    --m_count;
  }

  static bool hasInstance()
  {
    return (m_count > 0);
  }
};

int Test::m_count = 0;

int main()
{
    return 0;
}
于 2013-04-18T15:54:40.827 に答える
1

静的メンバーを使用して、コンストラクター/デストラクターに設定します。

class Test
{
  static int i;
public:
  Test()
  {
    i++;
  }

  Test(const Test &t) // It's suspicious 
  {
    i++;
  }

  ~Test()
  {
      i--;
  }

  static bool hasInstance()
  {
    return i>0;
  }
};

static int Test::i = 0;

次に、Testインスタンスがあるかどうかがわかります。

于 2013-04-18T15:55:32.720 に答える
1

すべてのインスタンスのコレクションを含む一種のファクトリ クラスはどうでしょうか。

何かのようなもの:

template<typename T>
class least_one_factory
{
    static std::vector<T> instances_;

public:
    least_one_factory()
    {
        // Make sure there is an instance of `T` in our collection
        instance_.push_back(T());
    }

    T& get()
    {
        return instances_.front();
    }

    T& get(int n)
    {
        return instances_.at(n);
    }

    T& create()
    {
        instances_.push_back(T());
        return instances_.back();
    }

    int count() const
    {
        return instances_.size();
    }

    operator T&()
    {
        return get();
    }
};

template<typename T>
std::vector<T> least_one_factory<T>::instances_;

これで、次のことができます。

struct some_class {};

least_one_factory<some_class> some_class_factory;

変数には、 の少なくとも1 つのインスタンスsome_class_factoryが含まれます。で取得できます。がグローバル変数の場合、 が呼び出される前にプログラムがロードされたときに のインスタンスが作成されます。some_classsome_class_factory.get()some_class_factorysome_classmain

于 2013-04-18T16:01:00.867 に答える