| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Создание объекта |
| Автор: Paradox 2.3.2004, 07:03 |
| Как в программе можно описать класс, так что объектов этого класаа, созданных в программе будет не более одного, т.е. если один уже есть то остальные невозможно создать даже по ошибке или преднамеренно |
| Автор: srd 2.3.2004, 07:10 | ||
Статический член-данное в качестве счетчика или указателя на созданный объект тебе поможет.
|
| Автор: Borisff2003 2.3.2004, 07:26 |
| Поищи в сети информацию по паттерну одиночка(Singleton). И вообще советую приобрести книгу "Приемы объектно-ориентированного проектирования. Паттерны проектирования" Э. Гамма и др. А самая простая но не лишеннаяя недостатков реализация class Singleton{ public: static Singleton* Intance(); protected: Singleton(); private: static Singleton * _instance; }; Singleton* Singleton::_instance = 0; Singleton* Singleton::Instance(){ if(_instance==0){ _instance=new Singleton; } return _instance; }; |
| Автор: Fantasist 3.3.2004, 22:31 | ||
А разрушение его только с убиванием процесса.
|
| Автор: Vyacheslav 4.3.2004, 11:29 |
| Иногда имеет смысл создавать динамичиски, для того чтобы точно контролировать время создания объекта. В варианте Borisff2003, например, объект будет создан, тогда когда впервые будет использован. При этом уже предполагается, что для создание и использования объекта созданы все условия. |
| Автор: Fantasist 4.3.2004, 21:12 | ||
В этом случае я бы предложил вариант инициализации, вместо создания динамически. Почему-то не хочется мне синглтон создавать динамически, если без этого можно обойтись. И не хочеться, чтобы пользователь работал с указателем на синглтон. |
| Автор: sergejzr 6.3.2004, 21:42 | ||||
Так как без статистических переменных не обойтись, предлагаю исползовать функцию (не конструктор) для создания обьектов и статистический указатель на созданный обьект...
и соответственно деструктор
для красоты можно запаковать это всё в класс для "раздачи" обьектов. PS: я так понял, что обьект всегда остаётся одним и тем же. Иначе можно конечно вернуть ноль, но тогда надо будет каждый раз проверять, а в таком случае можно было бы и статическую переменную класса опрашивать. а assert это конечно хорошо, только пользователю от них плохо становится. |
| Автор: Fantasist 7.3.2004, 01:01 |
| sergej.z а предыдущие ответы читать пробывали? |
| Автор: sergejzr 7.3.2004, 17:26 | ||
В принципе все правы и все ответы примерно одно и тоже |
| Автор: Fantasist 8.3.2004, 21:50 | ||||
Зато есть проблемы с логикой. Во-первых, называть функции create... и destroy... , которые в большинстве случаев ничего не создают и ничего не разрушают не очень понятно. Во-вторых, маловероятно понадобиться singleton, который постоянно создается и разрушается: чаще всего подразумевается один единственный экземпляр объекта, который существует непрерывно на всем промежутке его использования. В-третьих, совершенно не понятно зачем счетчик, если он никогда не будет иметь значения выше 1. Или 2? Так как в коде присутствует ошибка, непонятно, что задумывалось: то ли 1 и 2, то ли 0 и 1, то ли true и false. В-четвертых, непонятно в какой момент вызывать destroySingleton(). То ли каждый раз, после того как вызвали createSingleton(), что громозко и не удобно, то ли где-то в конце работы, тогда непонятно где.
Весьма спорное утверждение. Его вполне можно оставить существовать до конца работы программы и неубивать вообще, хоть это и не очень красиво, если память выделяется динамически. В моем варианте проблема освобождения памяти отсутсвует вообще. |
| Автор: FreshMeat 9.3.2004, 15:50 |
| http://anatolix.naumen.ru/cppbooks.htm Глава 6. Реализация шаблона Singleton. |
| Автор: sergejzr 9.3.2004, 20:00 | ||||||
To Fantasist:
А откуда юзеру знать? Он вызовет етy функцию каждый раз, когда Синглтон будет нужен (Представте многопоточное приложение).
кто его знает сколько раз юзер захочет Синглтон?
Не пробовал компилирировать To FreshMeat Спасибо! очень интересная ссылка. статический класс без конструктора - (IMHO) действительно в 90% лучшее решение ( из JAVA однако). PS: я всё равно за динамику потому что неизвестно будет ли вообше нужно создание обьекта этого класса. |