частный деструктор для singleton-класса

Действительно ли обязательно иметь частный деструктор для singleton-класса.

9
задан KhanS 17 April 2010 в 07:26
поделиться

5 ответов

Возможно, это не то, что вы ищете ... Но для справки я использую это следующим образом:

// .h
class Foo {
public:
    static Foo* getInstance();
    static void destroy();
private:
    Foo();
    ~Foo();

    static Foo* myInstance;
};

// .cpp
Foo* Foo::myInstance = NULL;

Foo* Foo::getInstance(){
    if (!myInstance){
        myInstance = new Foo();
    }
    return myInstance;
}
void Foo::destroy(){
    delete myInstance;
    myInstance = NULL;
}

Затем в конце моей программы я вызываю уничтожение объекта. Как указывает Петер, система освободит память, когда ваша программа завершится, так что реальной причины нет. Причина, по которой я использую уничтожение, - это когда Ogre пожаловался, что я не освободил всю выделенную память. После этого я просто использую это как «хороший способ», так как мне нравится убирать за собой.

7
ответ дан 4 December 2019 в 06:55
поделиться

Все классы имеют деструктор. Если вы не создадите его, компилятор сделает это за вас. Итак, ваш вопрос можно переформулировать так: Должен ли деструктор для одноэлементного класса быть закрытым?

Простой ответ - нет, это не обязательно.

Более интересный вопрос: стоит ли делать деструктор одноэлементного класса закрытым?

Да, в общем, это хорошая идея. Если вы сделаете его закрытым, ваш клиентский код не вызовет деструктор случайно. Вызов деструктора приведет к сбою синглтона для всех клиентов, поскольку экземпляр станет недействительным.

4
ответ дан 4 December 2019 в 06:55
поделиться

Нет, и в общем случае объекты в C ++ не имеют частных деструкторов. Имейте в виду, что синглтон означает, что существует только один экземпляр, и поэтому необходимо контролировать / предотвращать создание, а не разрушение. Обычно синглтон имеет частный конструктор, общедоступный деструктор, частную статическую переменную экземпляра и публичную статическую функцию get / lazy для построения синглтона, хотя есть варианты этого шаблона.

2
ответ дан 4 December 2019 в 06:55
поделиться

Вы можете вернуть ссылку на ваш экземпляр синглтона.

class Factory : public IFactory
    {
    private:
        /**
        * This class should not be instantiated through its constructor. Since, it implements 
        * Singleton pattern.
        */
        Factory();      
    public:
        virtual ~Factory();
        /**
        * Accessor method for singleton instance.
        * \note use this static method to access to operations of this class.
        */
        static IFactory& instance(){
            if(!m_instance.get()){
                m_instance.reset(new Factory());    
            }
            return static_cast<IFactory&>(*m_instance);
        }
        /**
        * \see IFactory::create
        */
        virtual boost::shared_ptr<IConnector> create();
    private:
        /* Singleton instance */
        static boost::scoped_ptr<Factory> m_instance;

    };
1
ответ дан 4 December 2019 в 06:55
поделиться

Если синглтон реализован как переменная в глобальной области видимости, он должен иметь деструктор public .Только публичные члены доступны в глобальном масштабе.

Если он объявлен как статический член или статический локальный элемент в собственном классе, то деструктор может быть закрытым. Деструктор вызывается из области видимости класса, где он доступен при выходе из программы. Это один из способов сделать объект одноэлементным. Вам нужно это строго соблюдать? Если да, то да. Это зависит от того, что вы подразумеваете под «обязательным».

class A{
private:
    ~A() {}
public:
    static A &getGlobalA() {
        static A a2; // <- or here - better technique
        return a2;   // this is initialized upon 1st access
    };               // and destroyed on program exit

    static A a; // <- constructor, destructor accessed from here
};

A A::a; // <- but "called" from here in terms of control flow
14
ответ дан 4 December 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: