![]() |
Модераторы: 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 |
Можно еще попробовать со стеком извратиться. В конструкторе заносить туда какую - нибудь фигню, а перед этим проверять.
![]() |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Perchilla
Это как? Добивать стек до определеннго размера(ну типа alloca(STACK_SIZE_MAX-CURRENT_STACK_SIZE), alloca - это выделение памяти в стеке), заносить в конец указатель на instance класса, и оттуда же брать? Или ты о чём-то другом? ![]() ![]() -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
S.A.P. |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2664 Регистрация: 11.6.2004 Репутация: 9 Всего: 71 |
Mayk я думал ассемблером через pop и push, хотя тут специфику компилятора надо знать, в каком порядке он параметры в функциях из стека выдергивает и т.д.
Че ржешь? ![]() |
|||
|
||||
chipset |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 164 |
Запихните конструктор в private и создайте функцию её вызывающую но только один раз.
--------------------
|
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Ну дыкть, расставляем всякие __stdcall(чтобы параметры не через регистры передавались, а то наоптимизируют тут), а далее известно - если было вызвано ptrSomeClass->func(a,b), то в стек пихается b,a,ptrSomeClass.
Мне задача нравится, уж больно весёлая.
Хорошо, как вызвать конструктор только один раз? Без использования static переменных? Глобальными пользоваться тоже не будем, потому что это будет повторение за Earnest. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Это как с мухоморами. Их есть можно, но только один раз. Пусть она вызовет конструктор, а потом подвесит систему нах ![]()
Всё равно использование стека не по назначению мне не нравится. -------------------- Да. Именно так. |
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Больше всего мне нравится способ, когда используется статическая переменная, определенная внутри функции. Она, конечно, статическая, но не совсем... Инициализируется только при первом обращении к функции, а не при загрузке, что иногда немаловажно, ну и абсолютно закрыта - ниоткуда кроме как изнутри функции к ней доступа нет.
Но слово static присутствует, увы... ![]() -------------------- ... |
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
ДАА!!!! ААААААААААААААААААААААААААААААААААААААААААА!!!!!!!!!!!!!!!!!!
Я РЕШИЛ ЭТУ ЗАДАЧУ!!!!!!!!!!!!!!!!!!!!!!!!!! ![]() БЕЗ ЕДИНОЙ СТАТИЧЕСКОЙ ПЕРЕМЕННОЙ! БЕЗ МЬЮТЕКСОВ! ОДНИМИ СРЕДСТВАМИ СИ++!!!! ААААААААААААААААААААААААААААААА!!! НИКОГДА НЕ ДЕЛАЙТЕ ЭТО В РЕАЛЬНЫХ ПРОЕКТАХ ))))))))))))))))))))))))))))))) Попробуйте разобраться в этом коде без комментариев. (Если быть совсем честным, то идея о сравнении класса принадлежит совсем не мне. Это было предложено в такой формулировке на форуме ФКН ОмГУ) :
Но пока кода не было. Как и не было указаний отностительно того, как список получить )
Это сообщение отредактировал(а) Mayk - 21.8.2005, 13:51 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Проверять сейчас не охота. Идею понял
![]() Но что-то у меня вызывает сомнения вот это. Карта памяти:
Вот здесь this указываем объект checker.
Поэтому вроде индексы надо брать не 0 и 3, а 1 и 4. А вот, чуть более красивое решение (смысл тот же), хотя работать будет, наверно, не везде. Проверено в Visual Studio 2003.
-------------------- Да. Именно так. |
||||||
|
|||||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
![]() Но в борле почему-то не работает Это недочёт борлы, или фича мс? Не могу инфу найти.
Упс, опечатался малость ![]() ЗЫ. Зато вот что нашёл рэмблер ![]()
зыы. О! Он нашел еще одну интересную ссылку. Пойду подниму еще одну тему ![]() Это сообщение отредактировал(а) Mayk - 21.8.2005, 19:41 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Скорее фича МС, хотя MSDN о ней вообще молчит ![]() ![]() ![]() И нашёл я её пока писал пример... Просто решил, а что будет если написать __unnamed и... сработало. За многие годы программирования уже почти телепатом стал ![]() ![]() -------------------- Да. Именно так. |
|||
|
||||
Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 92 |
Продолжаем извращения!!!
Чего-то не спалось, и вот что накарябал ![]() Теперь Singleton ещё и позволяет создать себя снова, после удаления! К сожалению тоже, не кроссплатформенное и работает только на x86 платформе ![]()
И хотя из WinAPI используется VirtualProtect, но это ограничение ОСи, т.к. запись в ту страницу запрещена. А вот в Windows не NT-серии сработало бы и без него ![]() Добавлено @ 03:10 Может я очень туплю, но что-то мне не пришло в голову лучшего способа сохранить IP, чем вызвать подпрограмму по call и считать вершину стека ![]() -------------------- Да. Именно так. |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
![]() Это сообщение отредактировал(а) Mayk - 22.8.2005, 11:21 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
Мда тут про синглтон больше чем в Современном проектировании на C++!
|
|||
|
||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Эт точно... И чем же вам static не угодил? Ведь на любой вкус можно настроить - тут вам и Мейерсовский, и Феникс (который позволяет себя заново создавать после удаления, как у Дрон-а парой постов выше), и даже с заданным временем жизни. Наверняка вы все читали Alexandrescu. --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
Mayk |
|
||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Не угадал. Например я даже не знаю, кто Александреску - это он или она? Александреску вроде писал(а) про шаблоны что-то страшное? Ну во всяком случае это имя часто упомянается рядом с шаблонами и чем-то страшным. Натяним за ущи ещё один вариант паттерна Безумный Синглтон, используя макросы, чтоб совсем оффтопом не было:
В данной реализации __makeMad() хэширует какую-либо строчку 5 раз и сравнивает хэши с аргументами. Если они не сходятся с указанными в аргументах, то клиент пытается нас надуть - throw ему. Мало того! Мы определяем thisGoesToObjFile; - глобальную переменную(привет, Earnest). Если кто-то преодолеет первую защиту из дефайнов, то линкер в конце заорет - типа две глобальные переменные объявлены. (да, я догадываюсь, что если бы я сказал это при приёме на работу, то куда-либо кроме дурдома меня бы не приняли) -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |