Pointers 要避免从原始指针创建std::shared_ptr?
我目前正在阅读**有效的现代C++一书,书中写道 避免从原始指针类型的变量创建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(
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_共享
以避免传递原始指针。@JoachimPileborgauto i=make_shared(42)
任何地方都没有传递原始指针。我遗漏了什么吗?在相关的注释中,您可能想了解一下。很明显,我不是在谈论使共享,但是OP在他的第二个问题中说使用了原始指针,这是真的。如果不传递,您就无法创建共享的ptr
对象指针。make_shared
很好,因为它隐藏了指针的创建。这实际上是一个有趣的解决方案。它可以工作,但客户端会有点困惑。但我仍然会接受答案。