К сожалению, не указано, какая функция на самом деле вызывает конструктор в make_shared
, поэтому вы не можете сделать эту функцию другом.Если у вас есть класс с закрытым конструктором, подобным этому, вы не сможете создать экземпляр с make_shared
.
. Однако вы можете создать производный класс с открытым конструктором, который вызывает соответствующий базовый класс.конструктор, и сделайте этот производный класс другом (чтобы он мог вызывать приватный конструктор):
class Foo
{
private:
Foo(int a){};
public:
static boost::shared_ptr do_foo();
friend class DerivedFoo;
};
class DerivedFoo: public Foo
{
public:
DerivedFoo(int a):
Foo(a)
{}
};
boost::shared_ptr<Foo> Foo::do_foo(){ return boost::make_shared<DerivedFoo>(5); }
Если DerivedFoo
находится в анонимном пространстве имен в файле .cpp, который определяет do_foo
, тогда функции вдругие файлы .cpp по-прежнему не смогут создавать экземпляры Foo
напрямую, и пользователи не смогут сказать, что на самом деле DerivedFoo
.