Ничего странного в этом нет. Более того, с этим высказывание никто и не спорил. Можешь найти хоть один пост хоть одного человека, который тебе сказал, что синглтон реализуем только на С++?Сионист писал(а):1. Что странного в том, что синглитон имеет смысл в рамках всего ООП?
В очередной раз призываю забыть о синглтонах и вернуться к тому, с чего всё началось. Распиши подробнее для каких именно объектов и отношений между ними необходимо создать объектную модель. Давай я попытаюсь объяснить так, как понял, а ты меня исправь, если я понял где-то неправильно.
Делаю предположение, что хочется реализовать некую модель из теории множеств. Есть некое множество элементов. Один из элементов выделен в качестве эталонного. Остальные определяются не сами по себе, а как разница между эталонным объектом и собой. Кстати, тут сразу вопрос. Может ли произвольный элемент множества быть определён только как разница от эталонного элемента или же может быть рекурсивная ситуация, когда он определён, как разница от другого не эталонного?
Вкратце по реализации того, что я уже понял. Статическое хранилище всех объектов данного класса внутри самого класса - это зло. Причин много, не хочу сейчас распинаться и всё расписывать. Скажу лишь, что в коммерческом коде в таких случаях обычно используют так называемое "хранилище". Оно не только создаёт объекты, но и отвечает за их владение. То есть вызывающий код не создаёт и не удаляет объекты явно. Он лишь "просит" у хранилища новый объект, получает указатель на него, работает с ним, а потом просто о нём забывает. Наше хранилище, кстати, как раз может быть честным синглтоном, правда при условии, что в объектной модели предполагается только один набор объектов (иначе же отдельное хранилище со своим эталоном на каждый набор).
По поводу создания эталонного объекта. Его создание в любом случае синтаксически отличается от создания остальных, так как ему требуется на один параметр меньше. То есть как минимум в одном месте мы должны будем вызывать для его создания либо специальный конструктор, либо специальный метод "хранилища". А если вызвали один раз, то и второй раз никто не запретит вызвать, даже если это неправильно с точки зрения логики. То есть сделать так, чтобы компиляция упала для второго вызова просто не получится. Проверку придётся делать в рантайме с помощью if. И если эталонный объект уже создан, то бросать исключение из конструктора, либо возвращать NULL из соответствующего метода хранилища.