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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> синглетон 
:(
    Опции темы
zss
Дата 18.2.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть устройство. С ним в один момент времени должен работать один объект класса, т.к. он хранит состояние устройства.
То есть мне нужна возможность запрета создания второго экземпляра, есть уже создан один.

Синглетом Майерса не подходит, т.к. объект должен создаваться и разрушаться динамически.
Как еще можно запретить создание второго экземпляра.
PM MAIL ICQ   Вверх
mes
Дата 18.2.2010, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(zss @  18.2.2010,  21:05 Найти цитируемый пост)
т.к. объект должен создаваться и разрушаться динамически.

а что должно происходить при вызове инстанции, если обьект еще не создан ?


--------------------
PM MAIL WWW   Вверх
zss
Дата 19.2.2010, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  18.2.2010,  23:14 Найти цитируемый пост)
а что должно происходить при вызове инстанции, если обьект еще не создан ? 

опрос устройства и хранение состояния для дальнейшего использования
PM MAIL ICQ   Вверх
borisbn
Дата 19.2.2010, 08:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Такой singletone подойдёт?

h-файл
Код

class Device
{
public:
    static Device & instance()
    {
        if ( m_inst )
        {
            return *m_inst;
        }
        else
        {
            return *( m_inst = new Device() );
        }
    }
    static void release()
    {
        delete m_inst;
        m_inst = 0;
    }
protected:
    static Device * m_inst;
    Device();
    ~Device();
};


cpp-файл
Код

#include "h-файл"

Device * Device::m_inst = 0;

Device::Device()
{
    // Здесь мог бы быть ваш код
}
    
Device::~Device()
{
    // Здесь мог бы быть ваш код
}


Когда нужно поработать с устройством вызывается Device::instance().foo()
Когда нужно освободить устройство вызывается Device::release()

Это сообщение отредактировал(а) borisbn - 20.2.2010, 11:39


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
zss
Дата 19.2.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



еще нашел такой
Код

class Singleton : private boost::noncopyable {
private :
    static Singleton* m_singleton;
    static bool m_destroy;

    Singleton ();
    ~Singleton ();

    static Singleton& Create (void)
    {
        static Singleton object;
        m_singleton = &object;
        return object;
    }
    static void Restore (void)
    {
        Create();
        new (m_singleton) Singleton ();
        #ifdef ATEXIT
        std::atexit (Destroy);
        #endif
        m_destroy = false;
    }
    static void Destroy (void)
    {
        m_singleton->~Singleton();
    }

public :
    static Singleton& Object (void)
    {
        if (m_singleton) return *m_singleton;
        if (m_destroy)
        {
            //Обнаружена висячая ссылка
            Restore ();
        }
        return Create();
    }
};


но что-то меня смущает навороченность со static
PM MAIL ICQ   Вверх
bsa
Дата 19.2.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



zss, синглтон без статик вообще невозможен...
Если тебе необходимо управляемое создание/уничтожение, то можно поступить так:
Код
class MyClass
{
public:
   MyClass() {
       assert(instance_ == 0);
       instance_ = this;
   }
   ~MyClass() {
       assert(instance_ != 0);
       instance_ = 0;
   }

   static MyClass& instance() {
       assert(instance_ != 0);
       return *instance_;
   }

private:
   static MyClass *instance_;
};
Таким образом, создать более одного экземпляра класса этот код не позволит. Так же он не позволит пользоваться не созданным экземпляром.
PM   Вверх
zss
Дата 19.2.2010, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  19.2.2010,  11:18 Найти цитируемый пост)
Таким образом, создать более одного экземпляра класса этот код не позволит. Так же он не позволит пользоваться не созданным экземпляром. 

но в данно случае мн е не удастся управлять временем жизни объекта, а это необходимо.


Цитата(bsa @  19.2.2010,  11:18 Найти цитируемый пост)
zss, синглтон без статик вообще невозможен...

ну может тогда не синглетон, а, например, именованный mutex в конструкторе

Это сообщение отредактировал(а) zss - 19.2.2010, 11:43
PM MAIL ICQ   Вверх
mes
Дата 19.2.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(zss @  19.2.2010,  10:43 Найти цитируемый пост)
но в данно случае мн е не удастся управлять временем жизни объекта, а это необходимо.

как я понял, Вам надо при создании первого объекта создать "устройство", при каждом следущем создании объекта использовать тоже самое "устройство", которое должно быть удалено вместе с удалением  последнего объекта, его использующего .

Тогда поможет патерн PImpl, только сделать его со статической shared имплементацией.
smile

если ж понял не правильно, то тогда уточните поведение, потому что задача не очень ясна и непонятно какой из кучи вариантов Вам подойдет smile

Это сообщение отредактировал(а) mes - 19.2.2010, 12:21


--------------------
PM MAIL WWW   Вверх
zss
Дата 19.2.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  19.2.2010,  12:19 Найти цитируемый пост)
как я понял, Вам надо при создании первого объекта создать "устройство", при каждом следущем создании объекта использовать тоже самое "устройство", которое должно быть удалено вместе с удалением  последнего объекта, его использующего .

ну или например запретить создание сбросом исключения
PM MAIL ICQ   Вверх
mes
Дата 19.2.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(zss @  19.2.2010,  11:26 Найти цитируемый пост)
ну или например запретить создание сбросом исключения 

ну это вообще просто, но смысла в таком поведение я не вижу, хотя Вам видней, что требуется smile

опять же заводите статическую переменную, и если в конструкторе она в состоянии "создано", то бросаете исключение,
иначе просто переводите в состояние "создано", а в деструкторе обратно.
smile

Это сообщение отредактировал(а) mes - 19.2.2010, 12:34


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 19.2.2010, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



zss

Не пойму чем static-и не угодили.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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