2008-09-13 3 views
-3

Я скоро опубликую статью на my blog, но я бы хотел подтвердить, что я ничего не пропустил первым.C++ Quiz - Singletons

Найдите пример, который я пропустил, и я приведу вас на свой пост.

Тема не работает. Реализации Singleton: В каких случаях вы можете случайно получить несколько экземпляров одноэлементного?

До сих пор, я придумал:

  • Состояние гонки на первом вызове instance()
  • инкорпорации в несколько библиотек DLL или DLL и исполняемый
  • определения шаблона одноточечного - собственно отдельные классы

Любые другие способы, которых мне не хватает - возможно, с наследованием?

+0

Я чувствовал, что это полное раскрытие, поскольку я хотел бы использовать информацию в этом посте в своем сообщении. Извините, мне было смешно делать это, но это остается интересным вопросом, не так ли? – theschmitzer 2008-09-13 17:59:10

+0

Сообщение вверх. Благодарю. – theschmitzer 2008-09-24 04:41:10

ответ

3

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

1

Наследование не должно быть проблемой до тех пор, пока ctor является закрытым.

Однако, если вы не запрещаете конструктор копирования, пользователи могут [un] умышленно скопировать экземпляр singleton. Частное наследование от boost::noncopyable - это самый простой способ предотвратить это.

+0

Вместо использования наследования, гораздо лучше просто объявить два неприятных метода как приватных. Сохраняет включение boost, если вы не хотите его вводить, и используя наследование (как незначительные издержки, так и хорошо знать) – hazzen 2008-09-13 05:51:36