статическая переменная позиция синглтона - PullRequest
2 голосов
/ 06 апреля 2011

У меня вопрос к Синглтону.

Где я должен объявить статический член синглтон-класса?

почему бы не работать так

class singleton{

  private:

  static singleton & m_singleton;

  public:

  static singleton& get_instance{

          return m_singleton;
  }

}

, но я должен быть таким

class singleton{

  public:

  static singleton& get_instance{

     static singleton & m_singleton;

          return m_singleton;
  }

}

В чем разница?

Я знаю, что есть другой способ использовать указатель, но сейчас я говорю только о случае использования объекта.

Еще один вопрос, каковы плюсы и минусы использования указателя и ссылки для синглтона?

Большое спасибо!

1 Ответ

5 голосов
/ 06 апреля 2011

В первом случае синглтон создается (вызывается конструктор) при инициализации программы до вызова main(). В этом случае вам также необходимо определить статическую переменную где-нибудь в вашем файле cpp.

Во втором случае синглтон создается при первом вызове функции. Помните, что эта реализация не является поточно-ориентированной, поскольку инициализация статических переменных в функциях не является поточно-ориентированной. Если два потока вызывают эту функцию в первый раз, есть небольшая вероятность, что вы получите два синглета.

Также обратите внимание, что у вас есть ошибка во втором. Вы не можете определить ссылку без инициализации. Это

static SomeClass &var;

Не компилируется. Вам нужно удалить ссылку, чтобы создать фактический экземпляр класса, а не ссылку, а затем вернуть ссылку на него.

Если во втором примере вы определили статическую переменную как указатель, вы можете избежать упомянутой мной проблемы с многопоточностью, аккуратно инициализируя указатель. Подробнее об этом читайте в статье этого класса (которая говорит о Java, но основная проблема та же)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...