Каково использование наличия деструктора как частное?

Вот кратчайший способ слияния двух массивов.

 var array1 = [1,2,3]
 let array2 = [4,5,6]

Объединить / объединить их

array1 += array2
New value of array1 is [1,2,3,4,5,6]
181
задан yesraaj 10 March 2009 в 18:59
поделиться

7 ответов

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

, Например, при выполнении своего рода вещи подсчета ссылок у Вас может быть объект (или менеджер, который был "другом" редактор), ответственный за подсчет количества ссылок на себя, и удалите его, когда число поражает нуль. Частный dtor препятствовал бы тому, чтобы кто-либо еще удалил его, когда были все еще ссылки на него.

Для другого экземпляра, что, если у Вас есть объект, который имеет менеджера (или оно), который может уничтожить его или может отказаться уничтожать его в зависимости от других условий в программе, таких как соединение с базой данных, являющееся открытым или записанный файл. У Вас могли быть "request_delete" метод в классе или менеджер, который проверит, что условие и он или удалят или уменьшат и возвратят состояние, говоря Вам, что это сделало. Это намного более гибко, который "удаляет" просто вызов.

168
ответ дан Venkatesh 4 November 2019 в 15:45
поделиться

Такой объект никогда не может создаваться на стеке. Всегда на "куче". И удаление должно быть сделано через друга или участника. Продукт может использовать иерархию отдельного объекта и пользовательского диспетчера памяти - такие сценарии могут использовать частный dtor.

#include <iostream>
class a {
    ~a() {}
    friend void delete_a(a* p);
};


void delete_a(a* p)  {
    delete p;
}

int main()
{
    a *p = new a;
    delete_a(p);

    return 0;
}
67
ответ дан dirkgently 4 November 2019 в 15:45
поделиться

COM использует эту стратегию удаления экземпляра. COM делает деструктор частным и обеспечивает интерфейс для удаления экземпляра.

Вот пример того, на что был бы похож метод Выпуска.

int MyRefCountedObject::Release() 
{
 _refCount--;
 if ( 0 == _refCount ) 
 {
    delete this;
    return 0;
 }
 return _refCount;
}

COM-объекты ATL являются главным примером этого шаблона.

16
ответ дан Vinay 4 November 2019 в 15:45
поделиться

Когда Вы не хотите, чтобы пользователи получили доступ к деструктору, т.е. Вы хотите, чтобы объект только был уничтожен через другие средства.

http://blogs.msdn.com/larryosterman/archive/2005/07/01/434684.aspx дает пример, где объект является считаемой ссылкой и должен только быть уничтожен самим объектом, когда количество переходит к нулю.

44
ответ дан Michael 4 November 2019 в 15:45
поделиться

Я знаю, что Вы спрашивали о частном деструкторе. Вот то, как я использую защищенные. Идея - Вы, не хотят удалять основной класс через указатель на класс, который добавляет дополнительную функциональность к основному.
В примере ниже я не хочу, чтобы GuiWindow был удален через указатель HandlerHolder.

class Handler
{
public:
    virtual void onClose() = 0;
protected:
    virtual ~Handler();
};

class HandlerHolder
{
public:
    void setHandler( Handler* );
    Handler* getHandler() const;
protected:
    ~HandlerHolder(){}
private:
    Handler* handler_;
};

class GuiWindow : public HandlerHolder
{
public:
    void finish()
    {
        getHandler()->onClose();
    }

    virtual ~GuiWindow(){}
};
3
ответ дан Mykola Golubyev 4 November 2019 в 15:45
поделиться

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

6
ответ дан Roland Rabien 4 November 2019 в 15:45
поделиться

Это мог бы быть способ иметь дело с проблемой в Windows, где каждый модуль может использовать различную "кучу", такой как Отладка "куча". Если та проблема не решена правильно плохой , вещи могут произойти.

2
ответ дан Community 4 November 2019 в 15:45
поделиться
Другие вопросы по тегам:

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