Синглтон-класс по вызову - PullRequest
1 голос
/ 27 ноября 2011

Есть ли какой-нибудь подход к инициализации синглтон-класса в стеке программ (следовательно, и переменных-членов)? Я пробовал следующее, оба были неудачными:

1)

class CStack{
public:
  void* getAlloc(long);
  static CStack& Instance(){
    static CStack theStack;
    return theStack;
  }

private:
  bool _data[100];

  CStack(){};
  CStack(const CStack&);
  CStack& operator=(const CStack&);
};

2)

class CStack{
public:
  void* getAlloc(long);
  static CStack* Instance();

private:
   CStack(){};
   CStack(CStack const&){};
   CStack& operator=(CStack const&){};
   static CStack* m_pInstance;
};

CStack* CStack::m_pInstance = NULL;

CStack* CStack::Instance(){
  if (!m_pInstance)   // Only allow one instance of class to be generated.
      m_pInstance = new CStack;

   return m_pInstance;
}

сначала не удалось из-за новой инициализации без размещения (m_pInstance = new CStack;), затем из-за отложенной инициализации. Может ли кто-нибудь помочь мне?

Спасибо

1 Ответ

3 голосов
/ 27 ноября 2011

Весь смысл синглтона не в том, чтобы полагаться на то, когда и где он инициализируется. Первый доступ инициализировал бы объект, и весь последующий доступ привел бы к тому же самому объекту.

Если вы поместите объект в стек - он будет разрушен, когда стек закрыт (вы выйдете из области видимости), таким образом, последующие доступы приведут либо к недействительному, либо к другому объекту, но не к тому же (как вы выходит за рамки того же).

Таким образом, по определению синглтона это сделать невозможно.

Теперь, если вы объясните проблему, которую вы пытаетесь решить, кто-то может помочь вам решить ее более разумным способом.

...