![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
patt |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.11.2004 Где: Николаев Репутация: 1 Всего: 2 |
Как сделать, что бы можно было создать не более одного экземпляра класса? (не используя статические переменные)
|
|||
|
||||
setq |
|
|||
Unregistered |
только хотел ответить "используй статическую переменную" %))
|
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Без статической переменной (хотя бы маааленького протииивненького указтеля, хотя бы маалюсенького счетчика кол-ва экземпляров) это просто невозможно. Ну разве что так, но это тоже по сути статическая переменная:
Бугага ![]() А если серьёзно, то чем вызвано нежелание использования статических переменных? Может легче обойти это ограничение? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Вот ещё одно безумное решение для винды.
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
patt |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.11.2004 Где: Николаев Репутация: 1 Всего: 2 |
Вопрос на собеседовании задали
![]() |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Тогда совсем бугага. Класс может быть в единственном экземпляре, если он не имеет имени - нечего создавать(но вариант с мьютексами более красив).
Ну это даже не бугага. Это бугого -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Mayk
Ну почему ж. Последнее решение очень даже интересно. А использование Mutex является стандартным подходом для разрешения не более одного инстанса приложения. ЗЫ: Хотя задачка действительно бугага ![]() -------------------- Да. Именно так. |
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Правда если поставить запятую после Singleton'а и написать Singleton2, то у нас будет два класса. К тому же typeof весь кайф портит. Наверное, есть ещё вариант. Надо думать.
У нас будет инстанс класса. Задача-то нетривиальна ![]()
Ага. Я о том же ![]() -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Dark Elf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 576 Регистрация: 26.12.2003 Где: Брисбен Репутация: 9 Всего: 10 |
||||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Кстати, в том виде, что ты написал будет вообще один объект на все приложения ![]() Так что имя мутекса нужно составлять уникальным для процесса. -------------------- Да. Именно так. |
|||
|
||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
... или потока - кто его знает, что это за класс? Вообщем getpid, GetCurrentThread, sprintf рулят. Хотя то решение полностью соответствует условию задачи ![]()
Там статическая переменная, что недопустимо. PS. А правильный ответ нам скажут? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да не может быть однозначно правильного ответа на неточно сформулированный вопрос. На собеседовании наверняка пытались тебя проверить на знание паттернов проектирования, а ответ ожидался типа: использовать паттерн Синглетон. Он может быть реализован многими способами, в том числе и без статических переменых (пусть будут глобальные
![]() А что касается разных способов защиты от того, что "нельзя" - ИМХО, здесь скорее речь должна идти о ясной декларации намерений разработчика. Если класс объявлен автором как синглетон - то надо быть придурком, чтобы создавать другие экземпляры. Защищаться надо от случайных ошибок, потому что при наличии большого желания в C++ можно добраться куда угодно и что угодно испортить - все же это C. Это я к тому, что защита единственности синглетона мьютексом - это уже слишком. Достаточно и классического варианта со статической функцией, возвращающей единственный экземляр. -------------------- ... |
|||
|
||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
ТОЧНО! ![]() ![]()
![]() ![]() -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Mayk
Да-а-а... вы тут все шутите... ![]() Я вот подумала и решила, что не такой уж он безумный, твой синглетон - в зависимости от задачи. Взять хотя бы реплику Дрона. Да и другие примеры можно, наверное, придумать. Кстати, в отличии от классических, он ведь срабатывает не на компиляции, а во время исполнения. Так что это новое слово в синглетоностроении. ![]() -------------------- ... |
|||
|
||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
Можно еще попробовать со стеком извратиться. В конструкторе заносить туда какую - нибудь фигню, а перед этим проверять.
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |