我目前正在关注这本书** 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
时,无法完成其工作。这就是我在上面的例子中使用静态方法的原因。我的问题是
shared_ptr
,但在这种情况下,我可以预测此指针可能发生的情况。这种做法是否仍然威胁到我的代码?答案 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
的参数,这是一个受保护的嵌套类,这样只有类本身(和派生类)可以构造这样的对象以将其传递给构造函数。