![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Paradox |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1135 Регистрация: 18.11.2002 Где: Россия Репутация: нет Всего: 1 |
Как в программе можно описать класс, так что объектов этого класаа, созданных в программе будет не более одного, т.е. если один уже есть то остальные невозможно создать даже по ошибке или преднамеренно
-------------------- --- |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: 27 Всего: 49 |
Статический член-данное в качестве счетчика или указателя на созданный объект тебе поможет.
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| Borisff2003 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 198 Регистрация: 26.2.2004 Где: г. Уфа Репутация: 1 Всего: 1 |
Поищи в сети информацию по паттерну одиночка(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 |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
А разрушение его только с убиванием процесса.
-------------------- Волны гасят ветер... |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Иногда имеет смысл создавать динамичиски, для того чтобы точно контролировать время создания объекта. В варианте Borisff2003, например, объект будет создан, тогда когда впервые будет использован. При этом уже предполагается, что для создание и использования объекта созданы все условия.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
В этом случае я бы предложил вариант инициализации, вместо создания динамически. Почему-то не хочется мне синглтон создавать динамически, если без этого можно обойтись. И не хочеться, чтобы пользователь работал с указателем на синглтон. -------------------- Волны гасят ветер... |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Так как без статистических переменных не обойтись, предлагаю исползовать функцию (не конструктор) для создания обьектов и статистический указатель на созданный обьект...
и соответственно деструктор
для красоты можно запаковать это всё в класс для "раздачи" обьектов. PS: я так понял, что обьект всегда остаётся одним и тем же. Иначе можно конечно вернуть ноль, но тогда надо будет каждый раз проверять, а в таком случае можно было бы и статическую переменную класса опрашивать. а assert это конечно хорошо, только пользователю от них плохо становится. Это сообщение отредактировал(а) sergej.z - 10.3.2004, 02:03 |
||||
|
|||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
sergej.z а предыдущие ответы читать пробывали?
-------------------- Волны гасят ветер... |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
В принципе все правы и все ответы примерно одно и тоже |
|||
|
||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Зато есть проблемы с логикой. Во-первых, называть функции create... и destroy... , которые в большинстве случаев ничего не создают и ничего не разрушают не очень понятно. Во-вторых, маловероятно понадобиться singleton, который постоянно создается и разрушается: чаще всего подразумевается один единственный экземпляр объекта, который существует непрерывно на всем промежутке его использования. В-третьих, совершенно не понятно зачем счетчик, если он никогда не будет иметь значения выше 1. Или 2? Так как в коде присутствует ошибка, непонятно, что задумывалось: то ли 1 и 2, то ли 0 и 1, то ли true и false. В-четвертых, непонятно в какой момент вызывать destroySingleton(). То ли каждый раз, после того как вызвали createSingleton(), что громозко и не удобно, то ли где-то в конце работы, тогда непонятно где.
Весьма спорное утверждение. Его вполне можно оставить существовать до конца работы программы и неубивать вообще, хоть это и не очень красиво, если память выделяется динамически. В моем варианте проблема освобождения памяти отсутсвует вообще. -------------------- Волны гасят ветер... |
||||
|
|||||
| FreshMeat |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 30.1.2004 Репутация: нет Всего: нет |
||||
|
||||
| sergejzr |
|
||||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
To Fantasist:
А откуда юзеру знать? Он вызовет етy функцию каждый раз, когда Синглтон будет нужен (Представте многопоточное приложение).
кто его знает сколько раз юзер захочет Синглтон?
Не пробовал компилирировать To FreshMeat Спасибо! очень интересная ссылка. статический класс без конструктора - (IMHO) действительно в 90% лучшее решение ( из JAVA однако). PS: я всё равно за динамику потому что неизвестно будет ли вообше нужно создание обьекта этого класса. |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |