Ну, простыми словами:
Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.
Итак, как это решить:
if (i == null) {
// Handle this
}
Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);
Взято из здесь:
Если конструктор / деструктор объявлен как закрытый, то класс не может быть создан.
Это верно, однако оно может быть создано из другого метода в классе. Аналогично, если деструктор
private
, то объект может быть удален только внутри класса. Кроме того, это предотвращает унаследование класса (или, по крайней мере, предотвращает создание или уничтожение унаследованного класса).
Если деструктор базового класса - private
или protected
, вы не можете вызвать delete
с помощью указателя базового класса.
Использовать защищенный деструктор для предотвращения уничтожения производного объекта через указатель базового класса. Он ограничивает доступ к destuctor для производных классов. И это предотвращает автоматические (стековые) объекты базы классов.
В действительности используется , чтобы разрешить любое другое полиморфное использование производных классов с помощью указателей, но не позволяют пользователям удалять с помощью такого указателя. Пример: - Абстрактные базовые классы / интерфейсы.
blockquote>Но деструктор
protected
,non-virtual
, кажется, ждет ошибки. Предполагая, что вы не предоставляете функциюdestroy()
, вы должны в конечном итоге сделать dtor public. Как только вы это сделаете, у вас больше нет контроля над классом, и вы рискуете получить полиморфное удаление с помощью не виртуального dtor, если кто-то получит дальнейшее развитие от вашего класса.
Следующий фрагмент кода приведет к ошибке компилятора (VC2010): C2248: «base :: ~ base»: не может получить доступ к частному члену, объявленному в классе «base»
class base
{
~base(){}
};
class derived : public base
{
};
int main ()
{
derived* d = new derived;
delete d;
}
Однако, если вы измените базовый деструктор, который будет защищен, все будет хорошо.
protected
, вы не смогли уничтожить объекты с помощью указателя базового класса. (В этом случае это также должно быть virtual
, BTW.) Что несколько поражает многие из целей деривации ...
– sbi
14 July 2010 в 16:22
Ответ заключается в том, что ваше предположение неверно. Деструктор базового класса нельзя вызывать, когда он является приватным.
new
класс, который имеет частный деструктор, но вы не можетеdelete
его (вне функций-членов и функций друга). – Thomas Eding 22 October 2012 в 18:28