Модераторы: 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   Вверх
Mayk
  Дата 19.7.2005, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Perchilla
Это как? Добивать стек до определеннго размера(ну типа alloca(STACK_SIZE_MAX-CURRENT_STACK_SIZE), alloca - это выделение памяти в стеке), заносить в конец указатель на instance класса, и оттуда же брать?
Или ты о чём-то другом?
smile smile



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


Эксперт
****


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

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



Mayk я думал ассемблером через pop и push, хотя тут специфику компилятора надо знать, в каком порядке он параметры в функциях из стека выдергивает и т.д.

Че ржешь? smile
PM MAIL   Вверх
chipset
Дата 19.7.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Запихните конструктор в private и создайте функцию её вызывающую но только один раз.


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Mayk
Дата 20.7.2005, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Perchilla @ 20.7.2005, 00:05)
в каком порядке он параметры в функциях из стека выдергивает и т.д.

Ну дыкть, расставляем всякие __stdcall(чтобы параметры не через регистры передавались, а то наоптимизируют тут), а далее известно - если было вызвано ptrSomeClass->func(a,b), то в стек пихается b,a,ptrSomeClass.
Цитата(Perchilla @ 20.7.2005, 00:05)
Че ржешь?

Мне задача нравится, уж больно весёлая.
Цитата(chipset @ 20.7.2005, 00:59)
Запихните конструктор в private и создайте функцию её вызывающую но только один раз.

Хорошо, как вызвать конструктор только один раз? Без использования static переменных? Глобальными пользоваться тоже не будем, потому что это будет повторение за Earnest.


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


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


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

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



Цитата(chipset @ 20.7.2005, 00:59)
Запихните конструктор в private и создайте функцию её вызывающую но только один раз.

Это как с мухоморами. Их есть можно, но только один раз.

Пусть она вызовет конструктор, а потом подвесит систему нах smile

Цитата(Mayk @ 20.7.2005, 08:57)
Ну дыкть, расставляем всякие __stdcall(чтобы параметры не через регистры передавались, а то наоптимизируют тут), а далее известно - если было вызвано ptrSomeClass->func(a,b), то в стек пихается b,a,ptrSomeClass.

Всё равно использование стека не по назначению мне не нравится.



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


Эксперт
****


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

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



Больше всего мне нравится способ, когда используется статическая переменная, определенная внутри функции. Она, конечно, статическая, но не совсем... Инициализируется только при первом обращении к функции, а не при загрузке, что иногда немаловажно, ну и абсолютно закрыта - ниоткуда кроме как изнутри функции к ней доступа нет.
Но слово static присутствует, увы... smile


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


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


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

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



ДАА!!!! ААААААААААААААААААААААААААААААААААААААААААА!!!!!!!!!!!!!!!!!!
Я РЕШИЛ ЭТУ ЗАДАЧУ!!!!!!!!!!!!!!!!!!!!!!!!!! smile
БЕЗ ЕДИНОЙ СТАТИЧЕСКОЙ ПЕРЕМЕННОЙ! БЕЗ МЬЮТЕКСОВ! ОДНИМИ СРЕДСТВАМИ СИ++!!!!
ААААААААААААААААААААААААААААААА!!!
НИКОГДА НЕ ДЕЛАЙТЕ ЭТО В РЕАЛЬНЫХ ПРОЕКТАХ )))))))))))))))))))))))))))))))

Попробуйте разобраться в этом коде без комментариев.
(Если быть совсем честным, то идея о сравнении класса принадлежит совсем не мне. Это было предложено в такой формулировке на форуме ФКН ОмГУ) :
Цитата(k0h)

Цитата(Mayk)
НЕ используя статические переменные?

так.... значит счётчики отпадают...
ну пусть конструктор класса запрашивает список созданных об'ектов и ищет себеподобных - если не найдёт - то все в порядке.

Но пока кода не было. Как и не было указаний отностительно того, как список получить
)

Код

#include <stdio.h>
#define Singleton_Header 0x1234fedc
#define Singleton_Footer 0x99663311

class {
    class checker
    {
            typedef struct{ int arr4[5]; }singleton_t;
    public:
        checker() {
            singleton_t *s = (singleton_t*) (this);
            s->arr4[0]=Singleton_Header;
            s->arr4[3]=Singleton_Footer;
            if((s[-1].arr4[0]==Singleton_Header && s[-1].arr4[3]==Singleton_Footer) || 
               (s[1].arr4[0] == Singleton_Header && s[1].arr4[3]==Singleton_Footer))
                throw int(1);
        }
        int s;
    };

    checker c;    
    public:
        int header;
        int data1;
        int data2;
        int footer;
}MadSinglton,d;

int main()
{
    MadSinglton.data1=1;
}


Это сообщение отредактировал(а) Mayk - 21.8.2005, 13:51


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


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


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

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



Проверять сейчас не охота. Идею понял smile
Но что-то у меня вызывает сомнения вот это.
Карта памяти:
Код

bytes  : { }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }{ }
members: {c::int s  }{header    }{data1     }{data2     }{footer    }
arr4   : {0         }{1         }{2         }{3         }{4         }


Вот здесь this указываем объект checker.
Код

singleton_t *s = (singleton_t*) (this);

Поэтому вроде индексы надо брать не 0 и 3, а 1 и 4.

А вот, чуть более красивое решение (смысл тот же), хотя работать будет, наверно, не везде. Проверено в Visual Studio 2003.
Код

#define Singleton_Header 0x1234fedc
#define Singleton_Footer 0x99663311

class
{
    int header;
public:
//////////////////////////////////////////////////////////////////////////

    int useful_data;

//////////////////////////////////////////////////////////////////////////

    __unnamed() // вот такой вот трюк :)
    {
        header = Singleton_Header;
        footer = Singleton_Footer;

        if(
            (*(int*)(((char*)&header) - sizeof(*this)) == Singleton_Header &&
            *(int*)(((char*)&footer) - sizeof(*this)) == Singleton_Footer)
            ||
            (*(int*)(((char*)&header) + sizeof(*this)) == Singleton_Header &&
            *(int*)(((char*)&footer) + sizeof(*this)) == Singleton_Footer)
            )
        {
            throw int(1);
        }

    }
private:
    int footer;

} Mad_Singleton1, Mad_Singleton2;

void main()
{
    Mad_Singleton1.useful_data = 5;
}



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


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


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

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



Цитата
__unnamed() // вот такой вот трюк smile

smile Класс, не знал
Но в борле почему-то не работает
Это недочёт борлы, или фича мс? Не могу инфу найти.


Цитата
Поэтому вроде индексы надо брать не 0 и 3, а 1 и 4.

Упс, опечатался малость smile. Там в начале немного другое распределение было, ну да ладно.

ЗЫ. Зато вот что нашёл рэмблер smile
Цитата

VPF::[опрос]Паттерны проектирования - Форум программистов Vingrad
08.04.2005 - 116 Kb - http://forum.vingrad.ru/index.php?act=ST&f=92&t=47


зыы. О! Он нашел еще одну интересную ссылку. Пойду подниму еще одну тему smile

Это сообщение отредактировал(а) Mayk - 21.8.2005, 19:41


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


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


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

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



Цитата(Mayk @ 21.8.2005, 20:40)
Но в борле почему-то не работает
Это недочёт борлы, или фича мс? Не могу инфу найти.

Скорее фича МС, хотя MSDN о ней вообще молчит smile smile smile

И нашёл я её пока писал пример...
Просто решил, а что будет если написать __unnamed и... сработало. За многие годы программирования уже почти телепатом стал smile smile


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


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


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

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



Продолжаем извращения!!!

Чего-то не спалось, и вот что накарябал smile
Теперь Singleton ещё и позволяет создать себя снова, после удаления!

К сожалению тоже, не кроссплатформенное и работает только на x86 платформе smile
Код

class AsmSingleton
{
private:
    friend AsmSingleton* GetInstance();

    unsigned char* iptr;

    void Replace(unsigned char val)
    {
        DWORD oldProtect;
        VirtualProtect(iptr,1,PAGE_READWRITE,&oldProtect); // снимем защиту памяти Windows NT
        *iptr = val;
        VirtualProtect(iptr,1,oldProtect,&oldProtect); // вернём защиту
    }

    AsmSingleton(unsigned addr)
    {
        iptr = (unsigned char*)addr + 3;
        Replace(0x74); // заменим jnz, на jz :)
    }

public:
    ~AsmSingleton()
    {
        Replace(0x75); // вернём обратно
    }
};

AsmSingleton* GetInstance()
{
    unsigned ip = 0;
    __asm
    {
        call saveaddr
        push eax
        sub eax, eax
        jnz errorLabel
        pop eax
        jmp skipaddr
saveaddr:
        pop ip
        push ip
        ret
skipaddr:
    }
    return new AsmSingleton(ip);
errorLabel:
    throw 0;
}

void main()
{
    AsmSingleton* as = GetInstance();
    delete as; // а если это убрать, то при создании нового объекта вызовет исключение
    AsmSingleton* as2 = GetInstance();
    delete as2;
}


И хотя из WinAPI используется VirtualProtect, но это ограничение ОСи, т.к. запись в ту страницу запрещена.
А вот в Windows не NT-серии сработало бы и без него smile
Добавлено @ 03:10
Может я очень туплю, но что-то мне не пришло в голову лучшего способа сохранить IP, чем вызвать подпрограмму по call и считать вершину стека smile


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


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


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

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



smile Класс. Это пять. Можно еще сделать так, чтобы экземпляр если есть возвращался.

Это сообщение отредактировал(а) Mayk - 22.8.2005, 11:21


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


Шустрый
*


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

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



Мда тут про синглтон больше чем в Современном проектировании на C++!
PM MAIL ICQ   Вверх
Chaos A.D.
Дата 22.8.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

Репутация: 6
Всего: 7



Цитата(Denn @ 22.8.2005, 12:29)
Мда тут про синглтон больше чем в Современном проектировании на C++!


Эт точно... И чем же вам static не угодил? Ведь на любой вкус можно настроить - тут вам и Мейерсовский, и Феникс (который позволяет себя заново создавать после удаления, как у Дрон-а парой постов выше), и даже с заданным временем жизни. Наверняка вы все читали Alexandrescu.

--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
Mayk
Дата 22.8.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Chaos @ 22.8.2005, 21:45)
Наверняка вы все читали Alexandrescu.

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


Натяним за ущи ещё один вариант паттерна Безумный Синглтон, используя макросы, чтоб совсем оффтопом не было:

Код

class MadSingleton
{
  freind MadSingleton* __makeMad(int hash1, int hash2, int hash3, int hash4, int hash5);
  MadSingleton
};
MadSingleton *a  
#include "makeMadSingleton.h"

/////////////////////////// makeMadSingleton.h
#ifdef makeMadSingleton_h
#error only one mad singleton allowed
#endif
#define makeMadSingleton_h
template <int n>
struct hashmaker5
{
    enum {value=n* hashmaker5<n-1>::value };
};
template <> struct hashmaker5<0>{
    enum {value=5};
};
int __hash1(); //возвращается из .обжа

=__makeMad(__hash1(),0x32432,0x34324,0x5435, hashmaker5<1>::value); //типа того
int thisGoesToObjFIle__ifYouSeeThis_YouVeTriedToCreate__Two_Singletons;


В данной реализации __makeMad() хэширует какую-либо строчку 5 раз и сравнивает хэши с аргументами.
Если они не сходятся с указанными в аргументах, то клиент пытается нас надуть - throw ему.
Мало того! Мы определяем thisGoesToObjFile; - глобальную переменную(привет, Earnest). Если кто-то преодолеет первую защиту из дефайнов, то линкер в конце заорет - типа две глобальные переменные объявлены.

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1314 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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