The*_*ist 6 c++ shared-ptr boost-asio type-traits c++11
我编写的类(通常作为其中的一部分boost::asio
),其对象依赖于shared_ptr
因为它们使用而被包装在a中shared_from_this()
.有没有办法防止对象被编译,如果它没有被实例化shared_ptr
?
所以,我正在寻找:
std::shared_ptr<MyClass> a = std::make_shared<MyClass>(); // should compile fine
std::unique_ptr<MyClass> a = std::make_unique<MyClass>(); // compile error
MyClass a; // compile error
Run Code Online (Sandbox Code Playgroud)
Lig*_*ica 13
使其构造函数为私有,并为其提供一个静态工厂成员函数,用于创建shared_ptr
.不要忘记在评论中记录您的设计决定!
// Thing that foos the bar
struct Foo : std::enable_shared_from_this<Foo>
{
// Returns a shared_ptr referring to a new instance of Foo
static std::shared_ptr<Foo> CreateShared()
{
return std::shared_ptr<Foo>(new Foo);
}
private:
// To avoid bugs due to the shared_from_this base,
// we restrict Foo creation to being via CreateShared().
Foo() = default;
};
Run Code Online (Sandbox Code Playgroud)
(我无法想象std::make_shared
由于私人ctor会有效,但你可以试试.)
不过,我必须说,这听起来并不像一个班级应该承担的责任.这是一种倒退的编程.
通常,如果对象包含在shared_ptr,堆中,堆栈,或指针,向量或数据成员中,则最好(如果可能)对象不会自我感知,或作为全球性的.一旦他们自我意识到他们如何管理生命周期,他们就会变得更加受限制.不必要的.
shared_from_this
(可以说)是一种反模式.但是......有时它可能是一种必要的反模式.
我宁愿避免enable_shared_from_this
并让人们使用你的,Foo
但他们认为合适,例如通过一个很好的精益unique_ptr
.
归档时间: |
|
查看次数: |
318 次 |
最近记录: |