Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > синглетон


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

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

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

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

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

опрос устройства и хранение состояния для дальнейшего использования

Автор: borisbn 19.2.2010, 08:08
Такой 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()

Автор: zss 19.2.2010, 10:11
еще нашел такой
Код

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

Автор: bsa 19.2.2010, 11:18
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_;
};
Таким образом, создать более одного экземпляра класса этот код не позволит. Так же он не позволит пользоваться не созданным экземпляром.

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

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


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

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

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

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

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

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

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

ну или например запретить создание сбросом исключения

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

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

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

Автор: azesmcar 19.2.2010, 12:50
zss

Не пойму чем static-и не угодили.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)