为了避免从原始指针创建std :: shared_ptr?

时间:2015-11-20 15:49:40

标签: pointers c++11 shared-ptr smart-pointers

我目前正在关注这本书** Effective Modern C ++"它说

  

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

我对这个解释深信不疑,所以我也同意我们需要避免的。但是我遇到了一个例外。

class Person
{
protected:
    Person();
public:

    static std::shared_ptr<Person> getShared()
    {
        return std::shared_ptr<Person>(new Person());
    }

当我们隐藏默认构造函数std::make_shared时,无法完成其工作。这就是我在上面的例子中使用静态方法的原因。我的问题是

  1. 我能做到最好吗?
  2. 我仍然使用原始指针创建shared_ptr,但在这种情况下,我可以预测此指针可能发生的情况。这种做法是否仍然威胁到我的代码?

1 个答案:

答案 0 :(得分:1)

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

class MyClass
{
protected:
    struct ConstructorGuard {};

public:
    MyClass(ConstructorGuard g) {}

    static std::shared_ptr<MyClass> create()
    {
         return std::make_shared<MyClass>(ConstructorGuard());
    }
};

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