Какова цель создания деструктора класса, защищенного? [Дубликат]

Ну, простыми словами:

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

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

24
задан doron 14 July 2010 в 14:50
поделиться

4 ответа

Взято из здесь:

Если конструктор / деструктор объявлен как закрытый, то класс не может быть создан.

Это верно, однако оно может быть создано из другого метода в классе. Аналогично, если деструктор private, то объект может быть удален только внутри класса. Кроме того, это предотвращает унаследование класса (или, по крайней мере, предотвращает создание или уничтожение унаследованного класса).

13
ответ дан Amir Rachum 25 August 2018 в 21:01
поделиться
  • 1
    public class A {private A () {} public A getA () {return new A (); }} Не совсем верно. – Stefan Kendall 14 July 2010 в 14:57
  • 2
    Это не правда. Объект с частным деструктором может быть создан, например (в стеке внутри функции друга). – SadSido 14 July 2010 в 14:59
  • 3
    Правильно не может быть выделен стек, но может быть выделена куча, а также из функций друга ... – Brian R. Bondy 14 July 2010 в 14:59
  • 4
    Это также имеет место, если деструктор защищен, поэтому это не дает разницы между защищенным и закрытым. – Mike Seymour 14 July 2010 в 15:10
  • 5
    Отсутствует факт: вы можете new класс, который имеет частный деструктор, но вы не можете delete его (вне функций-членов и функций друга). – Thomas Eding 22 October 2012 в 18:28

Если деструктор базового класса - private или protected, вы не можете вызвать delete с помощью указателя базового класса.

Использовать защищенный деструктор для предотвращения уничтожения производного объекта через указатель базового класса. Он ограничивает доступ к destuctor для производных классов. И это предотвращает автоматические (стековые) объекты базы классов.

В действительности используется , чтобы разрешить любое другое полиморфное использование производных классов с помощью указателей, но не позволяют пользователям удалять с помощью такого указателя. Пример: - Абстрактные базовые классы / интерфейсы.

Но деструктор protected, non-virtual, кажется, ждет ошибки. Предполагая, что вы не предоставляете функцию destroy(), вы должны в конечном итоге сделать dtor public. Как только вы это сделаете, у вас больше нет контроля над классом, и вы рискуете получить полиморфное удаление с помощью не виртуального dtor, если кто-то получит дальнейшее развитие от вашего класса.

23
ответ дан Abhay 25 August 2018 в 21:01
поделиться

Следующий фрагмент кода приведет к ошибке компилятора (VC2010): C2248: «base :: ~ base»: не может получить доступ к частному члену, объявленному в классе «base»

class base
{
    ~base(){}
};

class derived : public base
{
};

int main ()
{
    derived* d = new derived;

    delete d;
}

Однако, если вы измените базовый деструктор, который будет защищен, все будет хорошо.

6
ответ дан Nemanja Trifunovic 25 August 2018 в 21:01
поделиться
  • 1
    Но даже если вы изменили его на protected, вы не смогли уничтожить объекты с помощью указателя базового класса. (В этом случае это также должно быть virtual, BTW.) Что несколько поражает многие из целей деривации ... – sbi 14 July 2010 в 16:22

Ответ заключается в том, что ваше предположение неверно. Деструктор базового класса нельзя вызывать, когда он является приватным.

6
ответ дан Omnifarious 25 August 2018 в 21:01
поделиться
  • 1
    Итак, как мой класс уничтожается? – doron 14 July 2010 в 15:38
  • 2
    @ deus-ex-machina399: Это невозможно. Поэтому вы не можете извлечь из этого. И вы не можете создавать автоматические объекты. И динамические объекты никогда не могут быть удалены (если вы не предоставите функцию-член, которая делает это). – sbi 14 July 2010 в 16:20
Другие вопросы по тегам:

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