объект — Зачем запрещать статическое размещение в c ++?

Какой смысл делать конструктор класса закрытым и иметь метод getInstance, который возвращает новый экземпляр? Когда вы хотите разрешить только динамическое создание объектов и почему? Я видел примеры этого, и я не понимаю, почему.

0

Решение

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

1

Другие решения

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

0

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

  • образец Синглтона

  • поддержание неявного списка всех объектов живым, чтобы облегчить операции со всеми этими объектами

  • повторное использование объектов, которые уже живы

Последняя цель обычно также требует подсчета ссылок, чтобы иметь возможность уничтожать объекты, когда они больше не нужны, и требует, чтобы объекты были логически постоянными. Одним из применений этого является интернирование строк для повышения производительности (это позволяет сравнивать строки путем сравнения их указателей!).

0

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

Например, вы можете получить Connection скачать ресурс с URL и URL определит, какой конкретный тип Connection возвращается — HTTPConnection, HTTPSConnection, FTPConection так далее…

0