Pointers 要避免从原始指针创建std::shared_ptr?

Pointers 要避免从原始指针创建std::shared_ptr?,pointers,c++11,shared-ptr,smart-pointers,Pointers,C++11,Shared Ptr,Smart Pointers,我目前正在阅读**有效的现代C++一书,书中写道 避免从原始指针类型的变量创建std::shared_ptr 我相信这个解释,所以我也同意我们需要避免。但我遇到了一个例外 class Person { protected: Person(); public: static std::shared_ptr<Person> getShared() { return std::shared_ptr<Person>(new Person(

我目前正在阅读**有效的现代C++一书,书中写道

避免从原始指针类型的变量创建std::shared_ptr

我相信这个解释,所以我也同意我们需要避免。但我遇到了一个例外

class Person
{
protected:
    Person();
public:

    static std::shared_ptr<Person> getShared()
    {
        return std::shared_ptr<Person>(new Person());
    }
班级人员
{
受保护的:
人();
公众:
静态std::shared_ptr getShared()
{
返回std::shared_ptr(newperson());
}
当我们隐藏默认构造函数时,
std::make_shared
无法完成它的工作。这就是为什么我在上面的示例中使用静态方法。我的问题是

  • 这是我能做的最好的情况吗
  • 我仍然使用原始指针创建
    共享\u ptr
    ,但在这种情况下,我可以预测该指针可能发生的情况。这种做法是否仍然威胁到我的代码

  • 虽然这可能不是最好的方法,但是一种方法可以在一定程度上保护构造函数,但仍然可以通过
    std::make_shared
    调用它:

    class MyClass
    {
    protected:
        struct ConstructorGuard {};
    
    public:
        MyClass(ConstructorGuard g) {}
    
        static std::shared_ptr<MyClass> create()
        {
             return std::make_shared<MyClass>(ConstructorGuard());
        }
    };
    
    class-MyClass
    {
    受保护的:
    结构ConstructorGuard{};
    公众:
    MyClass(ConstructorGuard g){}
    静态std::shared_ptr create()
    {
    返回std::make_shared(ConstructorGuard());
    }
    };
    

    构造函数本身是公共的,但不能从类外部调用,因为它需要类型为
    ConstructorGuard
    的参数,该参数是受保护的嵌套类,因此只有类本身(和派生类)可以可以构造这样一个对象来将其传递给构造函数。

    当然,如果不传递原始指针,就不能创建
    std::shared_ptr
    对象,这本书说,你应该避免从指针变量创建共享指针。它就在引用中。:@JoachimPileborg你应该使用
    make_共享
    以避免传递原始指针。@JoachimPileborg
    auto i=make_shared(42)
    任何地方都没有传递原始指针。我遗漏了什么吗?在相关的注释中,您可能想了解一下。很明显,我不是在谈论
    使共享
    ,但是OP在他的第二个问题中说使用了原始指针,这是真的。如果不传递,您就无法创建
    共享的ptr
    对象指针。
    make_shared
    很好,因为它隐藏了指针的创建。这实际上是一个有趣的解决方案。它可以工作,但客户端会有点困惑。但我仍然会接受答案。