Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не более одного класса 
:(
    Опции темы
patt
Дата 18.7.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.11.2004
Где: Николаев

Репутация: 1
Всего: 2



Как сделать, что бы можно было создать не более одного экземпляра класса? (не используя статические переменные)
PM MAIL ICQ Skype GTalk   Вверх
setq
Дата 18.7.2005, 17:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











только хотел ответить "используй статическую переменную" %))
  Вверх
Mayk
Дата 18.7.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Без статической переменной (хотя бы маааленького протииивненького указтеля, хотя бы маалюсенького счетчика кол-ва экземпляров) это просто невозможно. Ну разве что так, но это тоже по сути статическая переменная:
Код

class HeapOnly
{
    public:
    static HeapOnly* (*makeHeapOnly)(void);
};

HeapOnly* makeHeapOnlyFunc();
HeapOnly*  (*HeapOnly::makeHeapOnly)()=makeHeapOnlyFunc;
HeapOnly* makeHeapOnlyFunc()
{
    HeapOnly* ho = new HeapOnly;
    HeapOnly::makeHeapOnly=NULL;
    return ho;
}

Бугага smile

А если серьёзно, то чем вызвано нежелание использования статических переменных? Может легче обойти это ограничение?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 18.7.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Вот ещё одно безумное решение для винды.
Код

class CrazySingleton
{
        private:
        HANDLE handle;
        public:
        CrazySingleton(){
                handle = CreateMutex(0,true,"MyCrazyMutex");
                if(GetLastError() == ERROR_ALREADY_EXISTS)
                        throw ERROR_ALREADY_EXISTS;
        }
        ~CrazySingleton(){
                ReleaseMutex(handle);
        }
};




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
patt
Дата 18.7.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.11.2004
Где: Николаев

Репутация: 1
Всего: 2



Вопрос на собеседовании задали smile
PM MAIL ICQ Skype GTalk   Вверх
Mayk
Дата 18.7.2005, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Тогда совсем бугага. Класс может быть в единственном экземпляре, если он не имеет имени - нечего создавать(но вариант с мьютексами более красив).
Код

class
{
    public:
    int doSomething(){printf("wtf\n");}
}Singleton;

int main()
{
    Singleton.doSomething();
}

Ну это даже не бугага. Это бугого


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 18.7.2005, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Mayk
Ну почему ж. Последнее решение очень даже интересно.

А использование Mutex является стандартным подходом для разрешения не более одного инстанса приложения.

ЗЫ: Хотя задачка действительно бугага smile


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 18.7.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата
Последнее решение очень даже интересно.

Правда если поставить запятую после Singleton'а и написать Singleton2, то у нас будет два класса. К тому же typeof весь кайф портит. Наверное, есть ещё вариант. Надо думать.

Цитата
А использование Mutex является стандартным подходом для разрешения не более одного инстанса приложения.

У нас будет инстанс класса. Задача-то нетривиальна smile Из неповторяйтеэтогодома: можем еще поинтер на диск сохранять. Или в хэш таблицу(которая в search.h - она одна на всё приложение).

Цитата
ЗЫ: Хотя задачка действительно бугага

Ага. Я о том же smile. У работадателей отменное чувство юмора: повеселили в волю. Если соберемся когда-нибудь делать что-то наподобие "Маленького теста"(как в Яве), то этот вопрос надо бы туда занести.




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Dark Elf
Дата 19.7.2005, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 26.12.2003
Где: Брисбен

Репутация: 9
Всего: 10





--------------------
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Дрон
Дата 19.7.2005, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 92



Цитата(Mayk @ 18.7.2005, 22:42)

У нас будет инстанс класса

Кстати, в том виде, что ты написал будет вообще один объект на все приложения smile

Так что имя мутекса нужно составлять уникальным для процесса.


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 19.7.2005, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата
Кстати, в том виде, что ты написал будет вообще один объект на все приложения smile
Так что имя мутекса нужно составлять уникальным для процесса.

... или потока - кто его знает, что это за класс? Вообщем getpid, GetCurrentThread, sprintf рулят.
Хотя то решение полностью соответствует условию задачи smile

Цитата(Dark @ 19.7.2005, 08:54)
http://www.firststeps.ru/theory/patt/r.php?10

Там статическая переменная, что недопустимо.

PS. А правильный ответ нам скажут?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 19.7.2005, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Да не может быть однозначно правильного ответа на неточно сформулированный вопрос. На собеседовании наверняка пытались тебя проверить на знание паттернов проектирования, а ответ ожидался типа: использовать паттерн Синглетон. Он может быть реализован многими способами, в том числе и без статических переменых (пусть будут глобальные smile).
А что касается разных способов защиты от того, что "нельзя" - ИМХО, здесь скорее речь должна идти о ясной декларации намерений разработчика. Если класс объявлен автором как синглетон - то надо быть придурком, чтобы создавать другие экземпляры. Защищаться надо от случайных ошибок, потому что при наличии большого желания в C++ можно добраться куда угодно и что угодно испортить - все же это C.
Это я к тому, что защита единственности синглетона мьютексом - это уже слишком. Достаточно и классического варианта со статической функцией, возвращающей единственный экземляр.


--------------------
...
PM   Вверх
Mayk
Дата 19.7.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Earnest @ 19.7.2005, 19:41)
(пусть будут глобальные smile)

ТОЧНО! smile Это пять. smile
Цитата(Earnest @ 19.7.2005, 19:41)
Это я к тому, что защита единственности синглетона мьютексом - это уже слишком.

smile Earnest, а то мы не в курсе smile



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 19.7.2005, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Mayk
Да-а-а... вы тут все шутите... smile
Я вот подумала и решила, что не такой уж он безумный, твой синглетон - в зависимости от задачи. Взять хотя бы реплику Дрона. Да и другие примеры можно, наверное, придумать.
Кстати, в отличии от классических, он ведь срабатывает не на компиляции, а во время исполнения. Так что это новое слово в синглетоностроении. smile


--------------------
...
PM   Вверх
S.A.P.
Дата 19.7.2005, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Можно еще попробовать со стеком извратиться. В конструкторе заносить туда какую - нибудь фигню, а перед этим проверять. smile .
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1091 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.