2015-03-31 1 views
0

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

ответ

0

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

1

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

+1

Например, класс который использует [shared_from_this] (http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this) для создания асинхронных обработчиков завершения, необходимо, чтобы экземпляры экземпляров были созданы определенным образом. –

+0

@DavidSchwartz: Точно. Счета ссылок и частные конструкторы/деструкторы часто встречаются вместе. –

0

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

  • одноплодной шаблон

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

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

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

0

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

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