Я знаю, что могу предотвратить обычное выделение кучи пользовательского класса и его потомков, сделав класс operator new
закрытым, но есть ли способ запретить пользователю библиотеки вызывать std::make_shared
для пользовательского класса (или егопотомки)?По-видимому, простое создание operator new
private в классе не останавливает его.
Обратите внимание, что я не хочу полностью запрещать создание общих указателей каким-либо образом, поскольку я намерен все еще иметь возможность производитьstd::shared_ptr
для моего пользовательского класса путем вызова метода статического генератора, но я все еще хочу, чтобы другие не пытались напрямую вызывать std::make_shared
в моем классе.
РЕДАКТИРОВАТЬ:
Для адресацииЗапросы ниже, моя конечная цель здесь - гибкий и многократно используемый механизм для извлечения shared_ptr из необработанного указателя.std::enable_shared_from_this
, к сожалению, не очень дружелюбен, когда речь идет о наследовании и особенно множественном наследовании.
Кроме того, поскольку я намерен использовать это, как в классе шаблона, использующем CRTP , для дочернего класса T может быть несколько сложнее явно сделать шаблонного родителякласс, который он наследует от друга, так что он может получить доступ к закрытым конструкторам.