Search code examples
c++visual-studio-2010shared-ptrfriend

friend function of std::make_shared() in Visual Studio 2010 (not Boost)


how to make friend function of std::make_shared().

I tried:

class MyClass{
public:
     friend std::shared_ptr<MyClass> std::make_shared<MyClass>();
     //or
     //friend std::shared_ptr<MyClass> std::make_shared();
protected:
     MyClass();
};

but it does not work (i'am using Visual Studio 2010 SP1)


Solution

  • How about adding a static method to your class:

    class Foo
    {
    public:
      static shared_ptr<Foo> create() { return std::shared_ptr<Foo>(new Foo); }
    private:
      // ...
    };
    

    Here's a little hackaround:

    class Foo
    {
      struct HideMe { };
      Foo() { };
    public:
      explicit Foo(HideMe) { };
      static shared_ptr<Foo> create() { return std::make_shared<Foo>(HideMe());
    };
    

    Nobody can use the public constructor other than the class itself. It's essentially a non-interface part of the public interface. Ask the Java people if such a thing has a name :-)