В чем смысл создания конструктора класса private и метода getInstance, который возвращает новый экземпляр? Когда вы хотите разрешить создание динамических объектов и почему? Я видел примеры этого, и я не понимаю, почему.Зачем запрещать статическое размещение в C++?
ответ
Самый очевидный пример - если класс управляет собственным временем жизни. Разрешение статического распределения приведет к двойному освобождению.
Это обычно делается, когда экземпляры экземпляров управляют собственным временем жизни, например. они будут подписываться на какое-то событие, которое происходит асинхронно. Если экземпляр был уничтожен до поступления события, диспетчер событий использовал бы дикий указатель и вызывал неопределенное поведение.
Обычно это связано с тем, что программист хочет контролировать объекты, которые находятся в живых в любое время. Допустимые случаи использования являются:
одноплодной шаблон
сохраняя неявный список всех объектов в живых, чтобы облегчить работу на всех этих объектах
повторное использование объектов, которые уже в живых
Последняя цель обычно также требует подсчета ссылок, чтобы иметь возможность уничтожать объекты, когда они не нужны. больше, и требует, чтобы объекты были логически постоянными. Одно использование этого - интернирование строк для производительности (это позволяет сравнивать строки, сравнивая их указатели!).
Одна из причин может заключаться в том, что вы хотите управлять конкретным типом, создаваемым как один из нескольких возможных подтипов, о которых не нужно знать вызывающее приложение.
Например, вы можете получить Connection
загрузить ресурс из URL
и URL
определит, какой конкретный тип Connection
возвращается - HTTPConnection
, HTTPSConnection
, FTPConection
и т.д ...
Например, класс который использует [shared_from_this] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this) для создания асинхронных обработчиков завершения, необходимо, чтобы экземпляры экземпляров были созданы определенным образом. –
@DavidSchwartz: Точно. Счета ссылок и частные конструкторы/деструкторы часто встречаются вместе. –