Мой друг сегодня спросил меня, почему он должен предпочесть использовать одноэлемент над глобальным статическим объектом? То, как я начал объяснять, было то, что у синглтона может быть состояние против статического глобального объекта, но не было ... но тогда я не был уверен ... потому что это на C++ .. (я шел из C#)
статический глобальный объект может иметь состояние в C#, а также:
class myclass {
// can have state
// ...
public static myclass m = new myclass(); // globally accessible static instance, which can have state
}
Каковы преимущества один над другим? (в C++)
Одиночный кадр повреждает ваш код, глобальный статический экземпляр этого не делает. Есть бесчисленные вопросы о SO о проблемах с одиночными играми. Here's one, and another, or another.
Короче говоря, одноэлементно дает вам две вещи:
- глобально доступный объект и
- гарантию, что только один экземпляр может быть создан.
Если мы хотим только первую точку, мы должны создать глобально доступный объект. И почему мы когда-нибудь захотим второй? Мы не знаем заранее, как наш код может быть использован в будущем, так зачем гвоздь его и удалить, что может быть полезной функциональностью? Обычно мы ошибаемся, когда мы прогнозируем, что «мне нужен только один экземпляр». И есть большая разница между «Мне нужен только один экземпляр» (правильный ответ - создать один экземпляр), и «приложение ни при каких обстоятельствах не может работать правильно, если создано более одного экземпляра. сбой, форматирование жесткого диска пользователя и публикация конфиденциальных данных в Интернете »(ответ здесь:« Скорее всего, ваше приложение сломано, но , если это не так, то да, то, что вам нужно)
а затем вы вводите сложные условия гонки и отбрасываете безопасность потоков, поскольку два потока могут одновременно вызвать эту функцию. – jalf
Как ни странно, std :: cout видит работу, несмотря на то, что это простой старый глобальный объект ... Я уверен, что порядок инициализации был такой большой проблемой.Это всего лишь проблема, если вы злоупотребляете глобальными шагами и зависеть от них друг от друга. – jalf
@jalf: Сделайте домашнее задание. 'cout' и' cin' специально заданы для построения до 'main()' по стандарту. Другие глобальные объекты не получают этого лечения. Кроме того, существуют потокобезопасные одноэлементные реализации и нетрудно написать себе; вам нужен только двойной замок, чтобы предотвратить двойную конструкцию. Лично я стараюсь избегать одиночных игр, я думаю, что образец чрезмерно используется. Но ваш недостаток знаний на С ++ не является причиной для меня. – rlbond